Добавить фильтр в ElasticSearch Query

Я пытаюсь создать запрос, где пользователь может искать документы ES, где поле бренда равно некоторой строке. Вот запрос, который у меня сейчас есть, который работает, но не имеет фильтрации. Я использую эластичные поисковые рельсы с Ruby on Rails.

@products = Product.search(
     query:{
        function_score:{
          query: {    
            multi_match: {
              fields: ['brand^5', '_all'],
              query: "#{query}",
              fuzziness: "AUTO"
            }
          },
          field_value_factor:{
            field: "popularity",
            modifier: "log1p"
          }
        }
     }).page(page).per(25)

Я статически назначил название бренда фильтру для целей тестирования. В этом случае пользователь должен видеть результаты для своего ключевого слова поиска, где название бренда - "NordicTrack".

query:{
        function_score:{
          query: {    
            multi_match: {
              fields: ['brand^5', '_all'],
              query: "#{query}",
              fuzziness: "AUTO"
            }
          },
          filter: {
            term: {"brand":"NordicTrack"}
          }, 
          field_value_factor:{
            field: "popularity",
            modifier: "log1p"
          }
        }
     }
     ).page(page).per(25)

Этот запрос дает мне следующую ошибку:

[400] {"error":{"root_cause":[{"type":"parsing_exception","reason":"no [query] registered for [filter]","line":1,"col":139}],"type":"parsing_exception","reason":"no [query] registered for [filter]","line":1,"col":139},"status":400}

Я не уверен, почему это не работает. Любая помощь будет оценена!

2 ответа

Решение

Я не уверен, что Elasticsearch-rails с Ruby on Rails анализирует Query. Но я попробовал ниже запрос в Кибане:

GET test/testt/_search
{
  "query": {
    "filter": {
      "term": {
        "brand": "NordicTrack"
      }
    }
  }
}

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

GET test/_search
{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "brand": "NordicTrack"
        }
      }
    }
  }
}

Дать ему шанс.

Попробуйте использовать отфильтрованный запрос следующим образом:

  query: {
    function_score: {
      query: {
        filtered: {
          query: {
            multi_match: {
              fields: ['brand^5', '_all'],
              query: "#{query}",
              fuzziness: "AUTO"
            }
          },
          filter: {
            term: {
              brand: "NordicTrack"
            }
          }
        }
      },
      field_value_factor:{
        field: "popularity",
        modifier: "log1p"
      }
    }
  }
Другие вопросы по тегам