Elastics使用com搜索电子邮件搜索与匹配查询不匹配

时间:2016-06-10 07:39:37

标签: elasticsearch

GET candidates1/candidate/_search
{
  "fields": ["contactInfo.emails.main"], 
  "query": { 
    "bool": { 
      "must": [
        { 
          "match": { 
            "contactInfo.emails.main": "com" 
          }
        }  
      ]
    }
  }
}
GET candidates1/candidate/_search
{
  "size": 5,
  "fields": [
    "contactInfo.emails.main"
  ],
  "query": {
    "match": {
      "contactInfo.emails.main": "com"
    }
  }
}

您好, 当我使用上述查询时,我得到的结果如['nraheem@dbtech1.com','arelysf456 @ gmai1.com','ron @ rgb52.com']但我没有收到像''pavann.aryasomayajulu @这样的电子邮件gmail.com”, 'kumar@gmail.com', 'raj@yahoo.com']

但是当我使用查询来匹配“gmail.com”时,我得到的结果有gmail.com

所以我的问题是当我在第一个查询中使用“com”时,我期待gmail.com中包含gmail.com的结果为“com”。但那并没有发生

注意:我们拥有近2百万封电子邮件,其中大多数是gmail.com,yahoo.com或hotmail,但只有少数是其他类型。

1 个答案:

答案 0 :(得分:1)

“contactInfo.emails.main”字段似乎是analyzed field

在elasticsearch中,所有字符串字段都使用Standard Analyzer进行分析并转换为标记。您可以使用analyze api查看文本的分析方式。您在com之前以数字结尾的电子邮件ID被分析为nraheemdbtech1com。使用以下查询查看tokens

curl -XGET 'localhost:9200/_analyze' -d '
{
 "analyzer" : "standard",
 "text" : "nraheem@dbtech1.com"
}'

正如您所看到的,创建了一个单独的术语com。如果您分析kumar@gmail.com,则会tokens kumargmail.com。在这种情况下,没有创建单独的令牌com

这是因为Standard Analyzer在遇到某些特殊字符(如@,?等)或数字时会对这些字词进行拆分。您可以创建custom Analyzer以满足您的要求。

希望这会有所帮助!!