过滤出嵌套对象ElasticSearch

时间:2018-07-03 14:21:52

标签: elasticsearch nest

美好的一天:

是否可以过滤掉不相关的嵌套对象?用例是您只有一个父级,但是父级有多个子级。例如,对于一个特定的父母来说……有100个孩子;我需要一种方法来过滤掉特定的孩子,以便在100个孩子中得到该结果的子集。

已更新

运行以下查询

GET /dev/doc/_search?typed_keys=true
{"_source":{"includes":["reviews"]},"query":{"nested":{"query":{"bool":{"filter":[{"term":{"reviews.userId":{"value":"339c8add-4278-4acd-905e-64b9acabc71a"}}}]}},"path":"reviews"}}}

但是,我得到了以下结果:

"reviews": [
            {
              "score": 0,
              "friendlinessOfStaff": 1,
              "amenities": 2,
              "grounds": 2,
              "reviewDate": "2018-07-03T02:00:34.8735726-07:00",
              "qualityOfCare": 4,
              "activities": 2,
              "facilityReviewReplies": [],
              "id": "56a4bac2-85d0-4ccf-aba2-fd9ff74fb3a5",
              "message": "blah blah blah",
              "userId": "339c8add-4278-4acd-905e-64b9acabc71a",
              "cleanliness": 4
            },
             {
              "score": 0,
              "friendlinessOfStaff": 1,
              "amenities": 2,
              "grounds": 2,
              "reviewDate": "2018-07-04T12:01:22.228658-07:00",
              "qualityOfCare": 4,
              "activities": 2,
              "facilityReviewReplies": [],
              "id": "f2f1b84e-bc1d-4e9c-b6d5-bdc578cb1b5f",
              "message": "blah blah blah",
              "userId": "7f1d389d-1316-4058-9857-ca51ecd9f5f8",
              "cleanliness": 4
            }
           ]

您可以看到此列表中的最后一个对象具有“ userId”:“ 7f1d389d-1316-4058-9857-ca51ecd9f5f8”与mot匹配,但是,过滤器仍在返回值。知道为什么会这样吗?

2 个答案:

答案 0 :(得分:2)

听起来您在问如何过滤返回的内部嵌套对象。如果您询问如何选择要返回的列而不过滤那些列中的数据,Andreas的答案将有所帮助。

要仅返回与查询匹配的嵌套对象,可以使用inner_hits。基本上只需将其添加到您的查询子句中,您就应该获得匹配的内部对象。您可以选择添加更多用于分页等的配置选项。

GET index/_search
{
    "query": {
        "nested": {
            "path": "field_name",
            "query": { ... },
            "inner_hits": {}
        }
    }
}

inner_hits reference

答案 1 :(得分:0)

您正在使用什么客户端?

您可能想要这样的东西(java):https://stackoverflow.com/a/30476650/5335131

否则,这是:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-source-filtering.html

您可以像这样指定要包括和排除的字段:

GET /_search
{
    "_source": {
        "includes": [ "obj1.*", "obj2.*" ],
        "excludes": [ "*.description" ]
    },
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}
相关问题