为什么Elasticsearch对于相同的查询在不同的索引上返回的结果太不同了?

时间:2019-02-19 03:37:12

标签: elasticsearch kibana elasticsearch-dsl

我首先使用Elasticsearch&Kibana,所以请对我的问题保持冷静!

我得到了一个ES,该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
}

1 个答案:

答案 0 :(得分:2)

情况1:event_type.keyword:PREC_AD_STARTED

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

情况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-*,因为在索引event_type时,查询位于类型text(默认分析器:标准)的字段PREC_AD_STARTED(不是event_type.keyword)上由于sub-field,被索引的值是prec_ad_started。上面的查询正在搜索'PREC_AD_STARTED'(带单引号)。即使此字符串也将通过标准分析器传递,该标准分析器也转换为prec_ad_started,因此此查询匹配。

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