【问题标题】:Elasticsearch, filter on full-text stringElasticsearch,过滤全文字符串
【发布时间】:2015-02-20 08:44:22
【问题描述】:

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

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

但我们永远不需要进行全文搜索,因此使用过滤器搜索的精确值就可以了。唯一的问题是这些值的类型暂时无法更改,因为时间不够。

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

我查看了文档并四处寻找,但无法得到明确的答案。

【问题讨论】:

  • “基于全文值的过滤器搜索”是指带有term 过滤器的过滤查询吗?
  • 是的,我今天试过了,它似乎只是没有找到那些值,只是排除它

标签: elasticsearch


【解决方案1】:

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

过滤具有包含术语(未分析)的字段的文档。

因此,您的索引应该具有类似于以下定义的映射:

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

鉴于上面的 sn-p,包含 term 过滤器的查询要求文档与 countryId 的某些指定参数完全匹配应该是成功的。类似于以下内容:

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

在 Elasticsearch here 中有更多关于 string 类型(和所有其他核心类型)的文档,但关于 index 属性的具体部分如下:

使用分析器将字段分解为标记后,设置为对要索引和可搜索的字段进行分析。 not_analyzed 表示它仍然可以搜索,但不经过任何分析过程或分解为标记。 no 意味着它根本不可搜索(作为单个字段;它可能仍包含在 _all 中)。设置为 no 会禁用 include_in_all。默认为已分析。

【讨论】:

  • 确实提到了精确值匹配的情况,但没有明确提到在对完整测试值应用过滤器时会发生什么。但我只能猜测文件过滤器将始终拒绝该值。
猜你喜欢
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
相关资源
最近更新 更多