Elasticsearch,过滤全文字符串

时间:2015-02-19 10:37:49

标签: elasticsearch

我刚刚开始使用Elasticsearch,我必须使用同事生成的数据。我注意到每个String数据都是一个全文值:

{
    "countryId": {
      "type": "string"
}

但我们永远不需要进行全文搜索,因此使用过滤搜索的精确值非常好。唯一的问题是,由于时间不够,这些值的类型暂时无法改变。

所以我的问题是:如果我对全文值进行基于过滤器的搜索,会发生什么?是否会像使用match搜索那样分析搜索条件,或者过滤器会忽略此值的全文类型并将其作为精确值处理,从而节省了大量搜索时间,因为过滤器是真的很快?

我查看了文档,但无法得到明确的答案。

1 个答案:

答案 0 :(得分:2)

您可能已经凭经验观察到尝试此操作时会发生什么,但为了使term过滤器按预期运行(与指定字段中的指定参数完全匹配),索引的映射必须定义字段的index属性为not_analyzedterm过滤器的官方文档为here,但最直接相关的部分可能是:

  

过滤包含字词(未分析)的字段的文档。

因此,您的索引应该具有与以下内容类似的映射:

{"mappings" : {"the_document_type": {
  "countryId" : {"type" : "string", "index" : "not_analyzed"},
  ...
  ... Mappings for other fields in your document
  ...
}}}

鉴于上面的代码段,包含term过滤器的查询应该成功,该过滤器要求文档与countryId的某些指定参数完全匹配。如下所示:

{"query" : {"filtered" :
  "query" : {"match_all" : {}},
  "filter" : {"term" : {"countryId" : "Kingdom of Anvilania"}}
}}

Elasticsearch here中还有string类型(以及所有其他核心类型)的进一步文档,但有关index属性的具体部分是:

  

设置为分析要使用分析器分解为令牌后要编入索引和可搜索的字段。 not_analyzed意味着它仍然可以搜索,但不会通过任何分析过程或分解为令牌。并不意味着它根本不可搜索(作为一个单独的领域;它可能仍然包含在_all中)。设置为no禁用include_in_all。默认为分析。