我想在Elastic Search Query中传递电子邮件列表,因此我尝试在下面的查询中实现该目的,但是没有得到任何结果。
{
"query": {
"terms": {
"email": [ "andrew@gmail.com", "michel@gmail.com" ]
}
}
}
当我使用 id 而不是电子邮件时,它起作用了!
{
"query": {
"terms": {
"id": [ 43, 67 ]
}
}
}
请您解释一下我的电子邮件查询出了什么问题以及如何使它起作用
答案 0 :(得分:0)
如果要将电子邮件地址识别为单个令牌,则应使用uax_url_email
令牌生成器。
一个工作示例:
映射
PUT my_index
{
"settings": {
"analysis": {
"analyzer": {
"my_email_analyzer": {
"type": "custom",
"tokenizer": "my_tokenizer",
"filter": ["lowercase", "stop"]
}
},
"tokenizer": {
"my_tokenizer":{
"type": "uax_url_email"
}
}
}
},
"mappings": {
"properties": {
"email": {
"type": "text",
"analyzer": "my_email_analyzer",
"search_analyzer": "my_email_analyzer",
"fields": {
"keyword":{
"type":"keyword"
}
}
}
}
}
}
发布一些文档
POST my_index/_doc/1
{
"email":"andrew@gmail.com"
}
POST my_index/_doc/2
{
"email":"michel@gmail.com"
}
搜索查询
GET my_index/_search
{
"query": {
"multi_match": {
"query": "andrew@gmail.com michel@gmail.com",
"fields": ["email"]
}
}
}
结果
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 0.6931472,
"hits" : [
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "1",
"_score" : 0.6931472,
"_source" : {
"email" : "andrew@gmail.com"
}
},
{
"_index" : "my_index",
"_type" : "_doc",
"_id" : "2",
"_score" : 0.6931472,
"_source" : {
"email" : "michel@gmail.com"
}
}
]
}
另一种选择是使用keyword
类型。
搜索查询
GET my_index/_search
{
"query": {
"terms": {
"email.keyword": [
"andrew@gmail.com",
"michel@gmail.com"
]
}
}
}
我认为使用uax_url_email
标记程序是更好的解决方案。
希望这会有所帮助