#elasticsearch
#elasticsearch
Вопрос:
Я пытаюсь объединить два предложения в одном запросе, но я вижу какое-то странное поведение и ищу рекомендации
Задан индекс «index1» с двумя документами —
{"column1": "A"} with _id=1
{"column1": "B"} with _id=2
При запуске POST index1 /_search со следующим телом —
{"query": {
"bool": {
"minimum_should_match": 1,
"should": [
{
"bool": {
"must": [
{"term": {"_id": "1"}},
{"term": {"column1": "A"}}
]
}
},
{
"bool": {
"must": [
{"term": {"_id": "2"}},
{"term": {"column1": "B"}}
]
}
}
]
}
}}
Я не получаю результатов. Я ожидал, что будут возвращены оба документа. Если я удалю одно из совпадений терминов column1, я получу другой документ. Если я удалю оба совпадения терминов column1, я получу оба документа?
Что я делаю не так?
Комментарии:
1. Если бы я написал это в SQL — ВЫБЕРИТЕ * ИЗ index1, ГДЕ (_id=1 И column1 = «A») ИЛИ (_id=2 И column1 = «B»)
2. тип данных column1 — ключевое слово
3. Каков тип сопоставления
column1
? Почти уверен, что этоtext
… у вас естьcolumn1.keyword
?4. @BobLukens у вас была возможность просмотреть мой ответ, с нетерпением жду обратной связи от вас 🙂
Ответ №1:
Как уже предлагал @Val, вам следовало использовать column1.keword
, если вы используете отображение по умолчанию для column1
Поисковый запрос:
{
"query": {
"bool": {
"minimum_should_match": 1,
"should": [
{
"bool": {
"must": [
{
"term": {
"_id": "1"
}
},
{
"term": {
"column1.keyword": "A"
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"_id": "2"
}
},
{
"term": {
"column1.keyword": "B"
}
}
]
}
}
]
}
}
}
Результат поиска:
"hits": [
{
"_index": "fd_cb",
"_type": "_doc",
"_id": "1",
"_score": 1.6931472,
"_source": {
"column1": "A"
}
},
{
"_index": "fd_cb",
"_type": "_doc",
"_id": "2",
"_score": 1.6931472,
"_source": {
"column1": "B"
}
}
]
Если вы уже определили явное сопоставление для column1
, как показано ниже :
{
"mappings": {
"properties": {
"column1": {
"type": "keyword"
}
}
}
}
Тогда поисковый запрос, упомянутый в вашем вопросе, работает отлично.