ElasticSearch NEST -查找带有特殊字符的结果

本文关键字:特殊字符 结果 NEST 查找 ElasticSearch | 更新日期: 2023-09-27 18:11:35

我正在尝试编写一个搜索查询弹性索引,将返回我的结果从字段值的任何部分。

我有一个Path字段,包含C:'temp'ab-cd'abc.doc

这样的值

我想发送一个查询的能力,将返回我的任何匹配部分从我写的

QueryContainer currentQuery = new QueryStringQuery
{
      DefaultField = "Path",
      Query = string.Format("*{0}*", "abc"),
};

上面会返回结果,下面不会:

QueryContainer currentQuery = new QueryStringQuery
{
      DefaultField = "Path",
      Query = string.Format("*{0}*", "ab-cd"),
};

同样适用于任何其他特殊字符,如@#$%^&*等等。

是否有一些通用的方式来发送查询并找到我搜索的内容?

我的每个字段都是multi-fields,我可以使用*.raw选项,但不完全知道如何或如果我应该

ElasticSearch NEST -查找带有特殊字符的结果

使用nGrams将文本分割成更小的块,并使用term过滤器进行查询。利:它应该更快。缺点:索引的大小(磁盘空间)将更大,因为生成了更多的术语(来自nGram过滤器)。

PUT /test
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_ngram_analyzer": {
          "tokenizer": "keyword",
          "filter": [
            "substring"
          ]
        }
      },
      "filter": {
        "substring": {
          "type": "nGram",
          "min_gram": 1,
          "max_gram": 50
        }
      }
    }
  },
  "mappings": {
    "test": {
      "properties": {
        "Path": {
          "type": "string",
          "index_analyzer": "my_ngram_analyzer",
          "search_analyzer": "keyword"
        }
      }
    }
  }
}

和查询:

GET /test/test/_search
{
  "query": {
    "term": {
      "Path": {
        "value": "'temp"
      }
    }
  }
}

如果你愿意,你可以使用上面的配置作为你已经拥有的任何映射的子字段。

如果你想使用query_string,有一件事你需要注意:你需要转义特殊字符。例如,-':(完整的列表在这里)。此外,在索引时,'字符需要转义,否则将发出错误。这是我测试的,特别是与query_string: https://gist.github.com/astefan/a52fa4989bf5298102d1