ElasticSearch - 匹配(电子邮件值)返回错误的寄存器

时间:2015-02-09 18:18:32

标签: elasticsearch

我正在使用匹配来搜索特定的电子邮件,但结果是错误的。匹配属性给我带来了类似的结果。如果结果存在,结果将显示在第一行,但是当结果不存在时,它会给我带来相同域的结果。

这是我的问题:

{
    "query": {
        "match" : {
            "email" : "placplac@xxx.net"
        }
    }
}

此电子邮件不存在于我的基础中,但返回值如香蕉@ xxx.net ,ronyvon @ xxx.net * 等。

如果查询中的值等于,我怎么强制返回?

提前感谢。

1 个答案:

答案 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"
            }
         }
      }
   }
}