我首先使用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
}
答案 0 :(得分:2)
event_type.keyword:PREC_AD_STARTED
在索引dia-*
中,属性event_type
具有一个名为keyword
的{{3}}。上面的查询引用了此子字段,即event_type.keyword
。对于dai-*
中的匹配项,将返回文档,而索引event_type
中字段ad-prior
的该子字段不存在,因此没有结果。
event_type:PREC_AD_STARTED
event_type。即使在索引dai-*
中,数据类型为text
,并且由于默认情况下应用了标准分析器,重做PREC_AD_STARTED
会导致prec_ad_started
。上面的查询将相同的分析器应用于输入字符串,然后还将其转换为prec_ad_started
,从而与文档匹配。
在索引为ad-prior
的情况下,event_type
的数据类型为keyword
,因此按原样索引了输入字符串。即使在搜索时也会发生同样的情况,因此在这种情况下,上面的查询也会匹配。
因此,如果有两个索引,此查询将为您提供结果。
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
),因此没有匹配项