Я столкнулся с проблемой, когда у меня есть два документа, каждый из которых содержит массив объектов. Мне нравится искать один документ, содержащий два свойства для вложенного объекта (совпадающие с обоими одновременно в одном объекте), но я всегда получаю оба документа.
Я создал документы с помощью:
POST /respondereval/_doc
{
"resp_id": "1236",
"responses": [
{"key": "meta","text":"abc"},
{"key": "property 1", "text": "yes"},
{"key": "property 2", "text": "yes"},
]
}
POST /respondereval/_doc
{
"resp_id": "1237",
"responses": [
{"key": "meta","text":"abc"},
{"key": "property 1", "text": "no"},
{"key": "property 2", "text": "yes"},
]
}
Я определил для них индекс, чтобы ES не выровнял такие объекты, как этот:
PUT /respondereval
{
"mappings" : {
"properties": {
"responses" : {
"type": "nested"
}
}
}
}
Теперь мне нравится искать первый документ (resp_id 1236
) с помощью следующего запроса:
GET /respondereval/_search
{
"query": {
"nested": {
"path": "responses",
"query": {
"bool": {
"must": [
{ "match": { "responses.key": "property 1" } },
{ "match": { "responses.text": "yes" } }
]
}
}
}
}
}
Это должно возвращать только один элемент, который соответствует обоим условиям одновременно.
К сожалению, он всегда возвращает оба документа. Я предполагаю, что это потому, что в какой-то момент ES все еще сглаживает значения в массивах вложенных объектов до чего-то вроде этого (упрощенного):
resp_id 1236: "key":["gender", "property 1", "property 2"], "text:["abc", "yes", "yes"]
resp_id 1237: "key":["gender", "property 1", "property 2"], "text:["abc", "no", "yes"]
, которые оба содержат property1
и yes
.
Как правильно решить эту проблему, чтобы возвращались только те документы, которые содержат элемент в массиве объектов, который соответствует обоим условиям ("key": "property 1" AND "text": "yes"
) одновременно?