Elasticsearch: Несколько ключевых слов не выполняют поиск по всем полям

#elasticsearch

Вопрос:

Я новичок в elasticsearch, и у меня возникли проблемы при поиске по всем полям с несколькими ключевыми словами. Например, если я поищу во всех своих полях термин: foo я получу все свои результаты обратно.

Но если я выполняю поиск по всем полям foo bar , он возвращает результаты только из одного поля, в котором есть foo и панель, когда я знаю, что в 1 поле есть элементы с foo, а в другом поле-панель.

Если я выполню поиск по всем полям foo "bar" , он будет работать правильно и вернет все результаты по всем полям, но на самом деле я не хочу пытаться объяснить пользователям предложения пользователей на втором сроке.

Есть идеи, где я ошибаюсь?

Запрос:

 {
  "query": {
   "bool": {
    "must": {
     "query_string": {
      "fields": ["heading, title, content, call_number"],
      "query": "foo bar",
      "default_operator": "AND"
    }
   }
  }
 }
}
 

Ответ №1:

Вы можете использовать multi_match с типом cross_fields. Попробуйте выполнить следующий запрос

 {
  "query": {
    "multi_match" : {
      "query":      "foo bar",
      "type":       "cross_fields",
      "fields":     [ "heading", "title" ]
    }
  }
}
 

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

 "hits": [
      {
        "_index": "69109590",
        "_type": "_doc",
        "_id": "2",
        "_score": 0.2876821,
        "_source": {
          "title": "bar"
        }
      },
      {
        "_index": "69109590",
        "_type": "_doc",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "heading": "foo"
        }
      }
    ]
 

Ответ №2:

То, что вы ищете, — это combined_fields поисковый запрос

Запрос combined_fields поддерживает поиск по нескольким текстовым полям, как если бы их содержимое было проиндексировано в одном объединенном поле. подробнее

 {
  "query": {
    "combined_fields": {
      "query": "foo bar",
      "fields": [
        "heading",
        "title",
        "content",
        "call_number"
      ],
      "operator": "and"
    }
  }
}