【问题标题】:elastic search: use terms in nested field弹性搜索:在嵌套字段中使用术语
【发布时间】:2016-03-14 23:30:04
【问题描述】:

我有很多包含如下数据的文档:

   "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]} }
]

但结果有点像 OR,我希望它是 AND。 我也试过这个,但它根本不起作用

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

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

谢谢。

【问题讨论】:

    标签: elasticsearch elasticsearch-query


    【解决方案1】:

    好吧,经过一番挖掘,我发现了问题,每个 bool 子句(必须、应该、必须_not)都应该有自己的嵌套查询,即

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

    等等。

    在我尝试使用“terms”搜索之前,它返回包含任何匹配项的文档,所以我得到了包含 187 或 399 的文档

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

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

    【讨论】:

      猜你喜欢
      • 2020-07-23
      • 2017-09-17
      • 2020-06-14
      • 2020-02-25
      • 1970-01-01
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多