Elasticsearch术语过滤器不返回任何结果

时间:2014-03-05 09:04:22

标签: elasticsearch

我有一堆带有数组字段的文档:

{ "feed_uids": ["math.CO", "cs.IT"] }

我想找到包含这些值的某些子集的所有文档,即将它们视为标记。文档让我相信术语过滤器应该起作用:

{ "query": { "filtered": { "filter": { "terms": { "feed_uids": [ "cs.IT" ] } } } } }

但是,查询不匹配任何内容。我做错了什么?

1 个答案:

答案 0 :(得分:18)

terms - 过滤器按预期工作。我想你的问题是你有feed_uids正在使用标准分析器的映射。

这是一个非常常见的问题,在这里有更深入的描述:Troubleshooting Elasticsearch searches, for Beginners

以下是一个可运行的示例,展示了如何为字段指定"index": "not_analyzed"https://www.found.no/play/gist/bc957d515597ec8262ab

#!/bin/bash

export ELASTICSEARCH_ENDPOINT="http://localhost:9200"

# Create indexes

curl -XPUT "$ELASTICSEARCH_ENDPOINT/play" -d '{
    "mappings": {
        "type": {
            "properties": {
                "feed_uids": {
                    "type": "string",
                    "index": "not_analyzed"
                }
            }
        }
    }
}'

# Index documents
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_bulk?refresh=true" -d '
{"index":{"_index":"play","_type":"type"}}
{"feed_uids":["math.CO","cs.IT"]}
{"index":{"_index":"play","_type":"type"}}
{"feed_uids":["cs.IT"]}
'

# Do searches

curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
    "query": {
        "filtered": {
            "filter": {
                "terms": {
                    "feed_uids": [
                        "cs.IT"
                    ]
                }
            }
        }
    }
}
'