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,但只有少数是其他类型。
答案 0 :(得分:1)
“contactInfo.emails.main”字段似乎是analyzed field。
在elasticsearch中,所有字符串字段都使用Standard Analyzer进行分析并转换为标记。您可以使用analyze api查看文本的分析方式。您在com
之前以数字结尾的电子邮件ID被分析为nraheem
,dbtech1
,com
。使用以下查询查看tokens
。
curl -XGET 'localhost:9200/_analyze' -d '
{
"analyzer" : "standard",
"text" : "nraheem@dbtech1.com"
}'
正如您所看到的,创建了一个单独的术语com
。如果您分析kumar@gmail.com
,则会tokens
kumar
,gmail.com
。在这种情况下,没有创建单独的令牌com
。
这是因为Standard Analyzer
在遇到某些特殊字符(如@,?
等)或数字时会对这些字词进行拆分。您可以创建custom Analyzer
以满足您的要求。
希望这会有所帮助!!