ElasticSearch使用模式分析器搜索特殊字符

时间:2015-05-13 11:57:15

标签: elasticsearch tokenize query-analyzer

我目前正在使用自定义分析器,将标记器设置为模式(\W|_)+因此每个术语只是字母并且在任何非字母上分开。作为示例,我有一个文档,其内容为[dbo].[Material_Get],另一个文档的内容为dbo.Another_Material_Get。我希望能够搜索“Material_Get”并对这两个文档进行搜索,但是如果我搜索“[Material_Get]”,它仍会点击dbo.Another_Material_Get,即使它没有括号。此外,如果我搜索“材料获取”(在引用的搜索中),我不应该获得任何点击,因为他们都没有这个短语。

我可以选择一个分析器/标记器,只要文件中的任何地方有输入字符串就可以找到,即使它旁边还有其他东西。例如,搜索“aterial_get”将在两者中匹配。我可以做任何一种情况吗?

1 个答案:

答案 0 :(得分:1)

根据你的解释,我得到的是你想做部分比赛,比如搜索" aterial_get"。

为了满足您的所有要求,您需要更改字段的映射,使其在分析器中具有ngram token filter,而无需删除特殊字符。样本分析仪看起来像

{
  "settings":{
    "analysis":{
      "analyzer":{
        "partialmatch":{
          "type":"custom",
          "tokenizer":"keyword",
          "filter":[ "lowercase", "ngram" ] 
        }
      },
      "filter":{
        "ngram":{
          "type":"ngram",
          "min_gram":2,
          "max_gram":15
        }
      }
    }
  }
}

在您的映射中定义your_field分析器" partialmatch"定义如上。您可以根据需要更改min_grammax_gram的值。

使用此映射,您可以执行正常的术语搜索,如下所示

{
    "term": {
        "your_field": "aterial_get"
    }
}