#elasticsearch
Вопрос:
Ищу помощь в формулировании запроса для следующего варианта использования. У меня есть текстовое поле и целое поле, которое является идентификатором. Мне нужно найти соответствующий текст, но я ожидаю, что ответ будет содержать результаты, соответствующие одному из идентификаторов. В качестве примера у меня есть два поля. Один из них-идентификатор продукта, который является текстом. И идентификатор владельца, который является целым числом. Владельцам должно быть разрешено просматривать только те продукты, которые принадлежат им. Чтобы добавить, у владельца может быть несколько идентификаторов.
Примеры записей в Elasticsearch:
{ "product": "MKL89ADH12", "ownerId" : 98765 }, { "product": "POIUD780H", "ownerId" : 12345 }, { "product": "UJK87TG89", "ownerId" : 98765 }, { "product": "897596YHJ", "ownerId" : 98765 }, { "product": "LKGGN764HH", "ownerId" : 784512 }
Если 98765 и 12345 принадлежат одному владельцу, они должны иметь возможность просматривать только первые 4 продукта. И никакие результаты не должны быть возвращены, если они ищут LKGGN764HH
.
Я попытался выполнить следующий запрос, но он не дал мне никаких результатов.
{ "size": 24, "query": { "bool": { "must":[{ "match" : { "product": { "query": "MKL89ADH12" } } }, { "match" : { "product": { "query": "LKGGN764HH" } } }, { "terms": { "ownerId": [98765, 12345], "boost": 1.0 } } ] } } }
Я ожидаю, что ответ будет содержать MKL89ADH12
, потому что я фильтрую по идентификатору владельца. Ищу помощь в формулировании правильного запроса для моего варианта использования.
Ответ №1:
Вам нужно отфильтровать «Идентификатор владельца»: [98765, 12345], а затем использовать предложение «должен» для возврата документов, которые соответствуют любому тексту.
{ "size": 24, "query": { "bool": { "filter": [ { "terms": { "ownerId": [ 98765, 12345 ], "boost": 1 } } ], "should": [ { "match": { "product": { "query": "MKL89ADH12" } } }, { "match": { "product": { "query": "LKGGN764HH" } } } ], "minimum_should_match": 1 } } }
Приведенный выше запрос будет переведен на
select * from index where ownerid in ( 98765, 12345) AND (product IN ("MKL89ADH12","LKGGN764HH))
в то время как ваши работы, такие как
select * from index where ownerid in ( 98765, 12345) AND product = "MKL89ADH12" AND product = "LKGGN764HH"
Комментарии:
1. Это сработало! Большое спасибо.