Исправление простого запроса Elasticsearch
У меня есть ниже данные:
{
"results":[
{
"ID":"1",
"products":[
{
"product":"car",
"number":"5"
},
{
"product":"computer",
"number":"212"
}
]
},
{
"ID":"2",
"products":[
{
"product":"car",
"number":"9"
},
{
"product":"computer",
"number":"463"
},
{
"product":"bicycle",
"number":"5"
}
]
}
]
}
И мой запрос ниже:
{
"query":{
"bool":{
"must":[
{
"wildcard":{
"results.products.product":"*car*"
}
},
{
"wildcard":{
"results.products.number":"*5*"
}
}
]
}
}
}
Я ожидаю получить только ID1. Потому что только у него есть продукт с записью { "product":"car", "number":"5" }. Но я получаю и ID1, и ID2, потому что первая запись ID2 имеет "product": "car", а третья запись имеет "number": "5" записей отдельно.
Как я могу исправить этот запрос?
1 ответ
Решение
Вы должны определить свои продукты как вложенный тип при создании отображения. Попробуйте использовать следующий пример сопоставления:
PUT http://localhost:9200/indexname
{
"mappings": {
"typename": {
"properties": {
"products" : {
"type" : "nested"
}
}
}
}
}
Затем вы можете использовать вложенные запросы, чтобы соответствовать целым элементам вашего массива - так, как вам нужно.
{
"query": {
"nested": {
"path": "products",
"query": {
"bool": {
"must": [
{ "wildcard": { "products.product": "*car*" }},
{ "wildcard": { "products.number": "*5*" }}
]
}
}
}
}
}