为什么elasticsearch对不同索引的相同查询返回的结果太不相同?

问题描述 投票:2回答:1

我首先使用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
}
elasticsearch kibana elasticsearch-dsl
1个回答
2
投票

Case 1: event_type.keyword:PREC_AD_STARTED

在指数dia-*,财产event_type有一个名为sub-fieldkeyword。上述查询涉及该子字段,即event_type.keyword。对于dai-*中的匹配,将返回文档,而对于event_type索引中的字段ad-prior,此子字段不存在,因此没有结果。

Case 2: event_type:PREC_AD_STARTED

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

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

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

Case 3: event_type:'PREC_AD_STARTED'

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

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

© www.soinside.com 2019 - 2024. All rights reserved.