Nest ElasticSearch: логический поиск с использованием вложенных запросов и вложенных объектов
Я использую Nest Elastic и строю запрос для логического поиска с помощью плагина Head, я объединяю несколько запросов
Примечания о структуре БД и упругом отображении
- Каждый документ в базе данных связан с определенным profileId, который в свою очередь имеет несколько атрибутов
- Каждый документ имеет несколько значений атрибутов, связанных с ним
В этом запросе я пытаюсь получить все документы, которые имеют определенный профиль и значение атрибута> 30, имея в виду, что этот атрибут должен иметь только атрибут Id 2.
SQL-запрос:
Выберите значение av.*, D.name из документа.D Значение атрибута внутреннего соединения av на d.DocumentId = av.DocumentId, где d.profileid = 1 и av.AttributeId = 2 и av.Intvalue >30
Эластичный запрос
{ "query": {
"bool": {
"must": [
{
"term": { "Document.profileid": "1" }
}
,
{
"term": {"Document.lstChildren.AttributeID": "2" }
}
,
{
"range": { "Document.lstChildren.IntValue": { "gt": "30"} }
}
,
{
"match_all": { }
}
],
"must_not": [ ],
"should": [ ]
}
}, "from": 0, "size": 10, "sort": [ ], "facets": { }
}
проблема
Результат также содержит документ, который имеет следующие значения атрибута
- Значение атрибута = 3 и attributeId = 2 (значение < 30)
- Значение атрибута = 34, но с attributeId, отличным от 2 (неверно)
Этот документ не должен быть включен, поскольку он не удовлетворяет моим потребностям.
Как я могу построить этот запрос?
1 ответ
Решение состоит в том, чтобы сначала изменить отображение, сделав lstChildren вложенным объектом. Тогда использование вложенного запроса обеспечит выполнение всех условий, как указано. Вложенный запрос ниже указывает два условия, которые возвращают только ожидаемые результаты, но я использовал "Равно" вместо "больше чем" для "IntValue", чтобы упростить его:
{
"query": {
"nested": {
"path": "lstChildren",
"query": {
"bool": {
"must": [
{
"match": {
"lstChildren.AttributeID":"2"
}
},
{
"match": {
"lstChildren.IntValue": "31"
}
}
]
}
}
}
}
}