弹性搜索:在嵌套字段中使用术语

时间:2016-03-14 10:28:58

标签: elasticsearch elasticsearch-query

我有很多文档,其数据如下所示:

   "paymentMethods": [
         {
            "id": 194,
            "name": "Wire",
            "logo": "wire.gif"
        }, {
            "id": 399,
            "name": "Paper Check",
            "logo": "papercheck.gif"
        }

映射:

 "paymentMethods": {
    "type": "nested",
    "properties": {
        "id": {
            "type": "long"
        },
        "logo": {
            "type": "string",
            "index": "not_analyzed"
        },
        "name": {
            "type": "string",
            "index": "not_analyzed"
        }
    }
 }

我尝试获取所有包含paymentMethos.id 399& 194。 这个查询对我有用:

    "query": {
        "filtered": {
            "filter": {
                "bool": {
                    "must": [{
                        "nested": {
                            "path": "paymentMethods",
                            "query": {
                                "bool": {
                                    "must": [

                                        {
                                            "term": {
                                                "paymentMethods.id": 399
                                            }
                                        }

                                    ]
                                }
                            }
                        }
                    }]
                }
            },
            "query": {
                "match_all": {}
            }
        }
    }

问题是我需要所有ID为399&的文件。 194 所以我试了一下:

"must" : [
   { "terms":{"paymentMethods.id" : [399,194]} }
]

但是结果有点或者我想要它作为AND。 我也试过这个,但它根本不起作用

"must" : [{
    "term": {
        "paymentMethods.id": 399
    }
}, {
    "term": {
        "paymentMethods.id": 194
    }
}]

任何建议如何获得paymentMethods.id 399& 194?

感谢。

1 个答案:

答案 0 :(得分:0)

好吧,经过一些挖掘我发现问题之后,每个bool子句(必须,应该,must_not)应该有它自己的嵌套查询,即

{"query": {
            "bool": {
                "must": [
                    {
                    "nested": {
                        "path": "paymentMethods",
                        "query": {
                            "term" : { "paymentMethods.id":399 }
                        }
                    }
                },
                {
                    "nested": {
                        "path": "paymentMethods",
                        "query": {
                            "term" : { "paymentMethods.id":187 }
                        }
                    },

等。

在我尝试使用"条款"进行搜索之前它返回带有任何匹配条款的文档,因此我得到了187或399的文档

上面的代码查询嵌套的隐藏文档两次一次为187次,一次为399次并返回两个查询的交集=>所有187和& 399

(当然第二个查询不再在所有文档上运行,而是在前一个过滤结果的结果上运行)