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

ElasticSearch NEST - Find results with special characters

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

我有一个 Path 字段,其中包含像 C:\temp\ab-cd\abc.doc

这样的值

我希望能够发送一个查询,该查询将return我所写内容中的任何匹配部分

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

};

上面会return结果,这个不会:

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

};

其他任何特殊字符也是如此,例如 @#$%^&* 等等。

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

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

使用 nGrams 将文本拆分成更小的块,并使用 term 过滤器对其进行查询。亲:应该更快。缺点:索引(磁盘 space)的大小会更大,因为会生成更多术语(来自 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,您需要注意一件事:您需要转义特殊字符。例如 -\:(完整列表 here). Also, when indexing, the \ char needs escaping, otherwise it will issue an error. This is what I tested especially with query_string: https://gist.github.com/astefan/a52fa4989bf5298102d1