Что неверно в этом Elasticsearch ИЛИ запросе?

#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"
      }
    }
  }
}
  

Тогда поисковый запрос, упомянутый в вашем вопросе, работает отлично.