弹性术语查询的意外结果

时间:2016-10-05 05:25:37

标签: elasticsearch

我在http://localhost:9200上运行Elastic 2.4仅用于测试。

设置

作为新的开始,我在索引中创建了1个且只有1个项目。

$ curl -s -XPUT "http://localhost:9200/movies/movie/1" -d'
{
    "title": "The Godfather",
    "director": "Francis Ford Coppola",
    "year": 1972,
    "genres": ["Crime", "Drama"]
}'

返回

{"_index":"movies","_type":"movie","_id":"1","_version":3,"_shards":{"total":2,"successful":1,"failed":0},"created":false}

然后我运行此命令以确认索引有效:

$ curl -s -XPOST "http://localhost:9200/movies/_search" -d'
{
    "query": {
        "query_string": {
            "query": "Godfather"
        }
    }
}'

返回

{"took":8,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":1,"max_score":0.095891505,"hits":[{"_index":"movies","_type":"movie","_id":"1","_score":0.095891505,"_source":
{
    "title": "The Godfather",
    "director": "Francis Ford Coppola",
    "year": 1972,
    "genres": ["Crime", "Drama"]
}}]}}

问题

我试图像这样运行术语查询:

$ curl -s -XPOST "http://localhost:9200/movies/_search" -d'
{
    "query": {
        "term": {"title": "The Godfather"}
    }
}'

我应该得到1个结果,而不是我得到了这个:

{"took":1,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}

我出错了什么?

1 个答案:

答案 0 :(得分:3)

{j}建议的match_phrase或您需要创建not_analyzed子字段(例如title.raw),如下所示:

$ curl -s -XPUT "http://localhost:9200/movies/_mapping/movie" -d'
{
    "properties": {
        "title": {
            "type": "string",
            "fields": {
               "raw": {
                   "type": "string",
                   "index": "not_analyzed"
               }
            }
        }
    }
}'

然后,您可以重新索引文档以填充title.raw

$ curl -s -XPUT "http://localhost:9200/movies/movie/1" -d'
{
    "title": "The Godfather",
    "director": "Francis Ford Coppola",
    "year": 1972,
    "genres": ["Crime", "Drama"]
}'

最后,您的字词查询将适用于title.raw子字段:

$ curl -s -XPOST "http://localhost:9200/movies/_search" -d'
{
    "query": {
        "term": {"title.raw": "The Godfather"}
    }
}'