Фильтр эластичного поиска 6.3 не работает с целочисленными столбцами - PullRequest
0 голосов
/ 29 июня 2018

Я включил эластичный поиск в приложение ROR.

Я использую эластичный поиск, чтобы найти продукты с именем 'xyz' и отфильтрованные по количеству звездочек = 1

Это мое отображение:

    {
      :product => {
        :dynamic => false,

        :properties => {
          :name => {
            :analyzer => "english",
            :type => "text"
          },
          :description => {
            :analyzer => "english",
            :type => "text"
          },
          :available => {
            :type => :boolean
          },
          :last_updated => {
            :type => :date
          },
          :categories_names => {
            :type => "text"
          },
          :stars => {
            :type => :integer
          }
        }
      }
    }

Я использую следующий запрос:

    {

      "query": {

        "bool": {
          "must": [
            {
              "multi_match": {
                "query": "xyz",
                "fields": ["name", "description"],
                "type": "most_fields"
              }
            },
            {
              "match": {
                "available": true
              }
            }
          ],
          "filter": {
            "term": {
              "stars": 1
            }
          }
        }
      }
    }

Это не дает мне соответствия, но у меня есть записи о продуктах со звездами, имеющими значение 1. Кроме того, запрос диапазона не дает никаких результатов со звездами поля.

Эта запись должна соответствовать указанному выше запросу:

#<Product> {
                         "id" => 90,
                       "name" => "xyz",
               "last_updated" => Tue, 22 May 2018 15:04:43 UTC +00:00,
                      "stars" => 1,
                "description" => "training",
                  "available" => true,
                 "created_at" => Thu, 21 Jun 2018 11:56:15 UTC +00:00,
                 "updated_at" => Fri, 29 Jun 2018 10:30:06 UTC +00:00,
}

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

попробуйте добавить doc_value: true при индексации поля

indexes :stars, type: 'integer', doc_values: true

Большинство полей индексируются по умолчанию, что делает их доступными для поиска. Инвертированный индекс позволяет запросам искать поисковый запрос в уникальном отсортированном списке терминов и сразу же получать доступ к списку документов, содержащих этот термин.

Сортировка, агрегирование и доступ к значениям полей в сценариях требуют другого шаблона доступа к данным. Вместо того, чтобы искать термин и находить документы, нам нужно иметь возможность искать документ и находить в нем термины.

Значения Doc - это структура данных на диске, построенная во время индексации документа, что делает возможным этот шаблон доступа к данным. Они хранят те же значения, что и _source, но ориентированы на столбцы, что более эффективно для сортировки и агрегирования. Значения документов поддерживаются практически для всех типов полей, за исключением заметных полей анализируемых строк.

Хотя по умолчанию doc_values ​​true, но его явное добавление решило мою цель

0 голосов
/ 29 июня 2018

Отображение и запрос выглядят хорошо, возможно, проблема в данных (или, возможно, отображение в вашем коде не совпадает в вашем кластере?).

Могу ли я предложить вам переместить соответствие «available: true» как «term» в части фильтра? Фильтр тоже массив, как должен.

...