Отфильтровать вложенные объекты ElasticSearch - PullRequest
0 голосов
/ 03 июля 2018

Добрый день:

Можно ли отфильтровать несвязанные вложенные объекты? Вариант использования: у вас есть один родитель, но у него есть несколько детей. Скажем, например, для конкретного родителя ... есть 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", который, однако, не совпадает, однако фильтр по-прежнему возвращает значения. Есть идеи, почему это так?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Звучит так, будто вы спрашиваете, как отфильтровать возвращаемые вложенные объекты. Ответ Андреаса поможет, если вы спросите, как выбрать столбцы, которые нужно возвращать без фильтрации данных в этих столбцах.

Чтобы вернуть только вложенные объекты, соответствующие вашему запросу, вы можете использовать inner_hits. По сути, просто добавьте его в ваше предложение запроса, и вы должны получить соответствующие внутренние объекты. Есть несколько дополнительных параметров конфигурации для подкачки и т. Д., Которые вы можете добавить.

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

ссылка на inner_hits

0 голосов
/ 03 июля 2018

Каким клиентом вы пользуетесь?

Вы, вероятно, хотите что-то вроде этого (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" }
    }
}
...