Попытка получить отфильтрованный ответ на запрос с несколькими терминами изasticsearch - PullRequest
0 голосов
/ 09 мая 2019

Как гласит заголовок, я пытаюсь сделать запрос, который не возвращает весь документ, а только определенные поля, но с несколькими точными терминами. Я использую Guzzle из Laravel для создания моего запроса:

            $response = $client->post('cvr-permanent/_search', [
        'auth' => ['USERNAME', 'PASSWORD'],
        'json' => [
            "_source" => ["Vrvirksomhed.attributter", "Vrvirksomhed.deltagerRelation.organisationer.medlemsData.attributter"],
            "query" => [
                "bool"=> [
                    "must"=> [
                        [
                            "term"=> [
                                "Vrvirksomhed.cvrNummer" => $vat
                            ]
                        ]],
                    "must_not"=> [ ],
                    "should"=> [ ]
                ]
                            ],
                    "from"=> 0,
                    "size"=> 10,
                    "sort"=> [ ]
        ]
    ]);

Я хочу получить данные из Vrvirksomhed.cvrNummer, а данные, которые мне нужны, это где Vrvirksomhed.attributter.type => "KAPITAL" и Vrvirksomhed.deltagerRelation.deltager.navne и где Vrvirksomhed.deltagerRelation.organisation.attributter.type = "EJERANDEL_PROCENT"

Я очень озадачен тем, как заставить этот запрос работать, потому что это несколько терминов, но не совсем. Также очень плохо знаком с эластичным поиском. Я попробовал «условия», но не смог заставить его работать. Запрос, который я сделал выше, возвращает слишком много данных, которые мне не нужны, и не все данные, которые мне НУЖНЫ.

Надеюсь, что вы можете помочь

** EDIT

Нечто подобное может быть, но переведено наasticsearch SELECT attributter.type": "KAPITAL" AND deltagerRelation.deltager.navne AND deltagerRelation.organisation.attributter.type": "EJERANDEL_PROCENT FROM Vrvirksomhed WHERE cvrNummer = $vat

*** EDIT Надеюсь, больше разъяснений:

Хорошо, извините, постараюсь прояснить ситуацию. Объект, который я хочу, - это компания с определенным номером НДС. Так что Vrvirksomhed.cvrNummer это то, и это должен быть термин. Он возвращает гигантский объект с таким количеством массивов в массивах. Я не хочу все эти данные, но только некоторые из них. Данные, которые мне нужны от этого большого объекта, - это объект в массиве Vrvirksomhed.attributter с полем type : "KAPITAL, а не все атрибуты. Тогда я хочу Vrvirksomhed.deltagerRelation.deltager.navne, который я могу получить, просто поместив его в _source, потому что я хочу все эти объекты. Но тогда я хочу Vrvirksomhed. deltagerRelation.organisation.attributter, что опять-таки является кучей объектов в массиве attributter, но я хочу только те, с type : "EJERANDEL_PROCENT

Так что я не могу добавить их в качестве дополнительных «терминов», потому что единственный реальный термин - это «cvrNummer», а все остальное - просто фильтрация ответа. Я пытался с фильтрами и т. Д., Но безрезультатно

Вот пастбина, так что вы можете видеть кластерного фуха, с которым я имею дело. Это то, что я смог отсортировать до сих пор, поместив вещи в _source, но без дополнительной «фильтрации» «KAPITAL» и «EJERANDEL_PROCENT» https://pastebin.com/b8hWWz1R

1 Ответ

1 голос
/ 10 мая 2019

Вы хотите получить только документы, которые соответствуют нескольким условиям, и вам нужно только подмножество полей из этих документов, верно?

В SQL (принимая некоторые вольности с именами полей и структурой) ваш запросбудет выглядеть примерно так:

SELECT cvrNummer
FROM Vrvirksomhed
WHERE attributter_type = 'KAPITAL'
  AND deltagerRelation_deltager_navne = 'you left this out in your question'
  AND deltagerRelation_organisation_attributter_type = 'EJERANDEL_PROCENT'

Как объяснено в Руководстве по Elasticsearch , эквивалентом этому в Elasticsearch является запрос с bool пункт , который содержит все ваши условия, и параметр _source , который говорит, какие поля вы хотите получить обратно в ответе.Примерно так:

{
    "_source": ["cvrNummer"]
    "query": {
        "bool": {
            "must": [
                { "term": "attributter.type": "KAPITAL" },
                { "term": "deltagerRelation.deltager.navne": "you left this out in your question" },
                { "term": "deltagerRelation.organisation.attributter.type": "EJERANDEL_PROCENT" }
            ]
        }
    }
}

† Обратите внимание, что синтаксис в этом руководстве предназначен для Elasticsearch 2.x.Текущая версия - 7.x, и с тех пор многое изменилось!

...