弹性搜索全文搜索查询和过滤器

时间:2015-11-19 13:27:40

标签: elasticsearch

我想进行全文搜索,但我也想使用一个或多个可能的过滤器。使用/things/_search?q=*foo*搜索时,文档的简化结构:

{
    "took": 5,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "failed": 0
    },
    "hits": {
        "total": 1,
        "max_score": 1,
        "hits": [
            {
                "_index": "things",
                "_type": "thing",
                "_id": "63",
                "_score": 1,
                "fields": {
                    "name": [
                        "foo bar"
                    ],
                    "description": [
                        "this is my description"
                    ],
                    "type": [
                        "inanimate"
                    ]
                }
            }
        ]
    }
}

这很好用,但如何将过滤器与查询结合起来呢?让我们说我想搜索" foo"在一个包含多个文档的索引中,但我只想获得那些类型为=="无生命的"?

这是我到目前为止的尝试:

{
    "query": {
        "filtered": {
            "query": {
                "query_string": {
                    "query": "*foo*"
                }
            },
            "filter": {
                "bool": {
                    "must": {
                        "term": { "type": "inanimate" }
                    }
                }
            }
        }
    }
}

当我删除filter部分时,它会返回一组准确的文档匹配。但是使用此过滤器定义它不会返回任何内容,即使我可以手动验证是否存在type == "inanimate"的文档。

1 个答案:

答案 0 :(得分:2)

由于您尚未进行显式映射,@查询正在寻找完全匹配。您需要将term添加到类型字段,然后您的查询才能生效。

这将为您提供正确的文件

"index : not_analyzed"

但这不是解决方案,你需要做我所说的显式映射。