Запрос Elasticsearch для сопоставления в одном поле, но должен фильтровать результаты на основе другого поля

#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. Это сработало! Большое спасибо.