我正在使用匹配来搜索特定的电子邮件,但结果是错误的。匹配属性给我带来了类似的结果。如果结果存在,结果将显示在第一行,但是当结果不存在时,它会给我带来相同域的结果。
这是我的问题:
{
"query": {
"match" : {
"email" : "placplac@xxx.net"
}
}
}
此电子邮件不存在于我的基础中,但返回值如香蕉@ xxx.net ,ronyvon @ xxx.net * 等。
如果查询中的值等于,我怎么强制返回?
提前感谢。
答案 0 :(得分:2)
您需要将"index":"not_analyzed"
放在"email"
字段上。这样,查询的唯一术语是已存储到该字段的确切值(与standard analyzer的情况相反,如果未列出分析器,则使用默认值。)
为了说明,我设置了一个简单的映射,其中email
字段未分析,并添加了两个简单的文档:
DELETE /test_index
PUT /test_index
{
"settings": {
"number_of_shards": 1,
"number_of_replicas": 0
},
"mappings": {
"doc": {
"properties": {
"email": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
PUT /test_index/doc/1
{"email": "placplac@xxx.net"}
PUT /test_index/doc/2
{"email": "placplac@nowhere.net"}
现在,您的匹配查询将仅返回与查询完全匹配的文档:
POST /test_index/_search
{
"query": {
"match" : {
"email" : "placplac@xxx.net"
}
}
}
...
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test_index",
"_type": "doc",
"_id": "1",
"_score": 1,
"_source": {
"email": "placplac@xxx.net"
}
}
]
}
}
以下是我使用的代码:
http://sense.qbox.io/gist/12763f63f2a75bf30ff956c25097b5955074508a
PS:您实际可能需要的是term query甚至是term filter,因为您不希望对查询文本进行任何分析。所以可能是这样的:
POST /test_index/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"email": "placplac@xxx.net"
}
}
}
}
}