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

时间:2015-09-08 07:41:11

标签: c# elasticsearch nest

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

我有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选项,但不知道我应该如何

1 个答案:

答案 0 :(得分:2)

使用nGrams以较小的块分割文本,并使用term过滤器进行查询。亲:它应该更快。 Con:索引(磁盘空间)的大小会更大,因为会生成更多的术语(来自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)。此外,在建立索引时,\ char需要转义,否则会发出错误。这是我使用query_string测试的内容:https://gist.github.com/astefan/a52fa4989bf5298102d1