在弹性搜索中查询电子邮件ID时出现错误的响应

时间:2015-05-22 06:05:00

标签: elasticsearch

当我在索引文档中搜索邮件ID时,elasticsearch正在撤回错误的结果。这是我使用的查询:

{
“query” : {
“match” : {
“mail” : “bill@gmail.com”
}
}
}

在整个索引文档中,只有一个文档包含值" bill@gmail.com"在现场"邮件"。但是,弹性搜索响应显示了许多其他文档,这些文档要么具有" bill"或" gmail.com"。为什么会发生这种情况,是否有人建议修复此行为?。

2 个答案:

答案 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"
      }
    }
  }
}'

这里"新闻"是我创建的索引的名称。用你的替换它。