当我在索引文档中搜索邮件ID时,elasticsearch正在撤回错误的结果。这是我使用的查询:
{
“query” : {
“match” : {
“mail” : “bill@gmail.com”
}
}
}
在整个索引文档中,只有一个文档包含值" bill@gmail.com"在现场"邮件"。但是,弹性搜索响应显示了许多其他文档,这些文档要么具有" bill"或" gmail.com"。为什么会发生这种情况,是否有人建议修复此行为?。
答案 0 :(得分:1)
我认为您的电子邮件地址可能会在编制索引时被标记化。因此,而不是bill@gmail.com,有三个令牌(条款):bill,gmail,com。如果是这种情况,请尝试将"index": "not_analyzed"
添加到其映射定义
或
尝试使用bool,如下所示:
{
"query": {
"bool": {
"must": [
{
"match": {
"mail": "bill@gmail.com"
}
}
]
}
}
}
答案 1 :(得分:0)
在elasticsearch中,默认情况下,需要使用"标准分析仪"作为默认分析器。 "标准分析仪"休息" bill@gmail.com"在" bill"和" gmail.com"。所以在你的案例中发生的事情是,当你搜索" bill@gmail.com"时,它会显示符合" bill"或" gmail.com"。
@yogesh提到了两种可能的解决方案。由elasticsearch提供的另一个解决方案是UAX电子邮件标记器。此分词器会保留电子邮件ID和URL链接,并且不会破坏它们。
您可以按如下方式应用UAX电子邮件令牌:
curl -X PUT "http://localost:9200/news" -d '{
"analysis": {
"analyzer": {
"urlAnalyzer": {
"type": "custom",
"tokenizer": "uax_url_email"
}
}
}
}'
And finally apply it on our field
curl -X PUT "http://$hostname:9200/news/public/_mapping" -d '{
"public": {
"properties": {
"mail": {
"type": "string",
"analyzer": "urlAnalyzer"
}
}
}
}'
这里"新闻"是我创建的索引的名称。用你的替换它。