【问题标题】:Why elasticsearch returns too different results for the same query on different indices?为什么弹性搜索在不同索引上为相同查询返回太不同的结果?
【发布时间】:2019-07-12 11:59:03
【问题描述】:

我第一次使用 Elasticsearch 和 Kibana,所以请保持冷静!

我得到了一个 ES,它已经有一个名为 dai-* 的索引,其中预先摄取了一些数据。为了安全地使用 ES,我创建了一个名为 ad-prior 的新索引。然后我继续为这两个索引提供如下数据:

{'obj_id': 'UHDRXEWEEK', 'event_type': 'PREC_AD_STARTED', 'event_id': '5c6b584373d', 'timestamp': 1550540223736L, 'channel_id': '123456789'}
{'obj_id': 'FDREJJSSHE', 'event_type': 'PREC_AD_STARTED', 'event_id': '4f53jhabd24', 'timestamp': 1550540225872L, 'channel_id': '123456789'}

然后我尝试在 Kibana 的 Discover 上进行搜索:

event_type.keyword:PREC_AD_STARTED
event_type:PREC_AD_STARTED
event_type:'PREC_AD_STARTED'

索引dai-*:以上搜索均返回367 hits

索引ad-prior:上述搜索返回不同的结果:event_type:PREC_AD_STARTED 返回8 hits,但另外两个返回0 hits

为什么上述搜索对dai-* 返回相同的结果,而对ad-prior 返回不同的结果?

更新

为了回答@Nishant Saini 的评论,我在此处获取了event_type 的我想成为的映射:

对于dai-*

"event_type": {
  "type": "text",
  "fields": {
    "keyword": {
      "type": "keyword",
      "ignore_above": 256
    }
  }
}

对于ad-prior

"event_type": {
  "type": "keyword",
  "ignore_above": 1024
}

【问题讨论】:

  • dai-* 使用通配符,因此针对所有以 dia- 开头的索引。新索引ad-prior 的映射是否与dia-* 相同?
  • @NishantSaini 我添加了更多细节。

标签: elasticsearch kibana elasticsearch-dsl


【解决方案1】:

案例一:event_type.keyword:PREC_AD_STARTED

在索引dia-* 中,属性event_type 有一个名为keywordsub-field。上面的查询引用了这个子字段,即event_type.keyword。对于dai-* 中的匹配,将返回文档,而索引ad-prior 中的字段event_type 不存在此子字段,因此没有结果。

案例2:event_type:PREC_AD_STARTED

event_type 存在于两个索引中。即使在索引dai-* 中,数据类型是text,并且由于默认情况下应用了标准分析器,因此PREC_AD_STARTED 将导致prec_ad_started。上述查询将相同的分析器应用于输入字符串,然后该字符串也转换为 prec_ad_started 并因此与文档匹配。

在索引ad-prior 的情况下,event_type 的数据类型是keyword,因此输入字符串按原样索引。即使在搜索时也会发生同样的情况,因此在这种情况下上面的查询也匹配。

因此,此查询会在两个索引的情况下为您提供结果。

案例3:event_type:'PREC_AD_STARTED'

对于索引dai-*,因为查询是在text 类型的字段event_type(而不是event_type.keyword)上(默认分析器:标准),当PREC_AD_STARTED 被索引时,被索引的值是@987654346 @由于standard analyzer。上面的查询正在搜索'PREC_AD_STARTED'(带单引号)。甚至这个字符串也将通过标准分析器传递,该分析器也转换为prec_ad_started,因此该查询匹配。

ad-prior 索引的情况下,event_typekeyword 类型,这意味着索引没有任何修改。由于我们在字段 event_type 上进行查询,因此查询将不应用任何分析器(因为数据类型为 keyword),因此将搜索 'PREC_AD_STARTED'(不是 PREC_AD_STARTED),因此没有匹配项。

【讨论】:

  • 感谢您的清晰解释!一个附带问题:有没有办法强制ad-prior 具有与dai-* 相同的映射?甚至是一种将映射从dai-* 复制到ad-prior 的方法?
  • 您可以使用GET <index_name>/_mappings获取索引的映射,然后使用PUT <new_index>使用您从获取映射api获得的映射创建索引。
  • 如果答案消除了您的疑问,请接受/投票 :)
  • 是的,两者都会:D
猜你喜欢
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 2016-07-28
  • 2021-02-10
  • 2015-10-10
相关资源
最近更新 更多