我首先使用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
}
event_type.keyword:PREC_AD_STARTED
在指数dia-*
,财产event_type
有一个名为sub-field的keyword
。上述查询涉及该子字段,即event_type.keyword
。对于dai-*
中的匹配,将返回文档,而对于event_type
索引中的字段ad-prior
,此子字段不存在,因此没有结果。
event_type:PREC_AD_STARTED
event_type存在于两个索引中。即使在索引dai-*
中数据类型是text
,并且因为默认情况下标准分析器应用theredore PREC_AD_STARTED
将导致prec_ad_started
。上面的查询将相同的分析器应用于输入字符串,然后转换为prec_ad_started
,从而匹配文档。
在索引ad-prior
的情况下,event_type
的数据类型是keyword
,因此输入字符串按原样索引。即使在搜索相同的情况时发生,因此上面的查询也匹配在这种情况下。
因此,此查询会在两个索引的情况下为您提供结果。
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_type
是keyword
类型,这意味着索引没有任何修改。由于我们在字段event_type
上查询,查询将不应用分析器(因为数据类型是keyword),因此将搜索'PREC_AD_STARTED'
(而不是PREC_AD_STARTED
),因此没有匹配。