在弹性搜索中未正确搜索电子邮件

时间:2016-02-01 07:06:09

标签: elasticsearch

我已将elasticsearch中的一些文档编入索引,这些文档将电子邮件ID作为字段。但是当我查询特定的电子邮件ID时,搜索结果会显示所有文档而不进行过滤。

这是我用过的查询

{
 "query": {
   "match": {
     "mail-id": "abc@gmail.com"
   }
 }
}

2 个答案:

答案 0 :(得分: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
  } ]
}

您需要的是使用UAX email URL tokenizer创建自定义分析器,它会将电子邮件地址标记为一个令牌。

所以你需要按如下方式定义索引:

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

创建该索引后,您可以看到电子邮件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
  } ]
}

答案 1 :(得分:0)

使用默认映射时会发生这种情况。 Elasticsearch具有uax_url_email标记器,可将网址和电子邮件标识为单个实体/令牌。 您可以详细了解此herehere