在Elasticsearch中无法正确搜索电子邮件

ant*_*ena 1 elasticsearch

我在elasticsearch中索引了一些文档,这些文档以电子邮件ID作为字段。但是,当我查询特定的电子邮件ID时,搜索结果显示的是所有文档而没有过滤。

这是我使用过的查询

{
 "query": {
   "match": {
     "mail-id": "abc@gmail.com"
   }
 }
}
Run Code Online (Sandbox Code Playgroud)

Val*_*Val 5

默认情况下,mail-id标准分析器会分析您的字段,该分析器会将电子邮件标记abc@gmail.com为以下两个标记:

{
  "tokens" : [ {
    "token" : "abc",
    "start_offset" : 0,
    "end_offset" : 3,
    "type" : "<ALPHANUM>",
    "position" : 1
  }, {
    "token" : "gmail.com",
    "start_offset" : 4,
    "end_offset" : 13,
    "type" : "<ALPHANUM>",
    "position" : 2
  } ]
}
Run Code Online (Sandbox Code Playgroud)

相反,您需要使用UAX电子邮件URL令牌生成器创建自定义分析器,该分析器会将电子邮件地址令牌化为一个令牌。

因此,您需要按以下方式定义索引:

curl -XPUT localhost:9200/people -d '{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "tokenizer": "uax_url_email"
        }
      }
    }
  },
  "mappings": {
    "person": {
      "properties": {
        "mail-id": {
          "type": "string",
          "analyzer": "my_analyzer"
        }
      }
    }
  }
}'
Run Code Online (Sandbox Code Playgroud)

创建该索引后,您可以看到该电子邮件abc@gmail.com将被标记为单个标记,并且您的搜索将按预期进行。

 curl -XGET 'localhost:9200/people/_analyze?analyzer=my_analyzer&pretty' -d 'abc@gmail.com'
{
  "tokens" : [ {
    "token" : "abc@gmail.com",
    "start_offset" : 0,
    "end_offset" : 13,
    "type" : "<EMAIL>",
    "position" : 1
  } ]
}
Run Code Online (Sandbox Code Playgroud)