Как объединить запрос точного соответствия с запросом текстового поиска?

#elasticsearch #elastic-stack #elasticsearch-5 #elasticsearch-dsl

#elasticsearch #elastic-stack #elasticsearch-5 #elasticsearch-dsl

Вопрос:

Мой запрос точного соответствия по статусу полей, location_id выглядит следующим образом:

 {'query': {'constant_score': {'filter': {'bool': {
     'must': [{'bool': {'should': [{'terms': {'status': ['Open', 'not complete']}}]}},
              {'bool': {'should': [{'terms': {'location_id': [1652]}}]}}],
     'must_not': []}}}},
 'sort': [{'id': {'order': 'asc', 'unmapped_type': 'long'}}]}
  

Предположим, что приведенный выше запрос возвращает 50 записей, теперь в этих 50 записях я хочу выполнить поиск по слову в одном из столбцов. Например, столбец — описание, а слово — «тест». Как я могу объединить приведенный выше запрос с этим запросом поискового слова.
Столбец поиска может быть одним из обязательных запросов (статус / местоположение)

Короче говоря, я хочу, чтобы все записи имели статус Open / Not complete и location_id == 1652, а поле описания содержало слово «test» в любом месте текста

Я пробовал simple_query_String и query_string, но получал ошибку. Не уверен, где я могу поместить его во вложенный запрос выше.

Я попробовал ниже запрос с совпадением, но он не записывает никаких записей:

 {'query': {'constant_score': {'filter': {'bool': {
     'must': [{'bool': {'should': [{'terms': {'status': ['Open', 'not complete']}}]}},
              {'bool': {'should': [{'terms': {'location_id': [1652]}}]}},
              {'bool': {'should': [{'match': {'description': 'test'}}]}}],
     'must_not': []}}}},
 'sort': [{'id': {'order': 'asc', 'unmapped_type': 'long'}}]}
  

Рабочий запрос с использованием query_string

 {'query': {'constant_score': {'filter': {'bool': {
     'must': [{'bool': {'should': [{'terms': {'status': ['Open', 'not complete']}}]}},
              {'bool': {'should': [{'terms': {'location_id': [1652]}}]}},
              {'query_string': {"default_field": "description",
                                "query": "*test*"}}],
     'must_not': []}}}},
 'sort': [{'id': {'order': 'asc', 'unmapped_type': 'long'}}]}
  

Комментарии:

1. какую версию elasticsearch вы используете?

2. у вас была возможность просмотреть мой ответ, с нетерпением жду обратной связи от вас 🙂

3. @BhavyaGupta Да, попробовал ваш ответ и добавил обновленный запрос в вопросе. Но все равно он не работал с запросом соответствия . Пробовал использовать подстановочный знак и query_string , сейчас он работает, но запрос чувствителен к регистру. Хотел сделать его нечувствительным к регистру

4. Версия @BhavyaGupta — 5.6.16

5. было бы здорово, если бы вы могли добавить некоторые образцы данных, по которым вы выполняете свой поисковый запрос

Ответ №1:

Вы можете использовать логический запрос, где

Запрос сопоставляет документы, соответствующие логическим комбинациям других запросов.

Добавление рабочего примера с индексными данными, поисковым запросом и результатом поиска. Приведенный ниже поисковый запрос соответствует вашим следующим требованиям:

Короче говоря, я хочу, чтобы все записи имели статус Open / Not complete и location_id == 1652, а поле описания содержало слово «test» в любом месте текста

Индексировать данные:

 {
  "description":"test",
  "status":["open","not connected"],
  "location_id":[1652]
}
  

Поисковый запрос:

 {
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "description": "test"
          }
        },
        {
          "terms": {
            "status": [
              "open",
              "not complete"
            ]
          }
        },
        {
          "terms": {
            "location_id": [
              "1652"
            ]
          }
        }
      ]
    }
  }
}
  

Результат поиска:

 "hits": [
      {
        "_index": "stof_63936644",
        "_type": "_doc",
        "_id": "1",
        "_score": 2.287682,
        "_source": {
          "description": "test",
          "status": [
            "open",
            "not connected"
          ],
          "location_id": [
            1652
          ]
        }
      }
    ]
  

Комментарии:

1. Спасибо за ответ. Попробовал запрос соответствия, но он не вернул никаких результатов, даже если есть совпадающие записи. Я добавил соответствующий запрос, который я пробовал

2. @GauravVichare как вы упомянули в вопросе, вы хотите, чтобы все записи имели статус Open / Not complete и location_id == 1652, а поле описания содержало слово «test»

3. @GauravVichare можете ли вы предоставить какие-либо образцы индексных данных, к которым вы пытаетесь запросить, потому что данные, которые я тестировал с помощью данного поискового запроса, работают нормально, и я могу получить результат