Elasticsearch - хотите сортировать по полю во всех индексах, где это конкретное поле доступно или нет, если нет, то избегайте этого - PullRequest
2 голосов
/ 27 мая 2020

В настоящее время получение результата на основе скоринга, но я хочу получить результат на основе скоринга + Статус поля со значением true / false.

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

           "query" => [
                  'bool' => [
                     'filter' => $filter,
                     'must' => [
                     "multi_match" => [
                        'query' => "$string",
                        "type" => "cross_fields",
                        'fields' => ['field1','field2','field3'],
                        "minimum_should_match" => "80%"
                         ]
                    ]
                  ]
            ],
            "sort" => [
                    "_score",
                    [ "status" => ["order" => "desc","unmapped_type" => "boolean"] ]
            ],

Но появляется ошибка ниже:

[type] => illegal_argument_exception
[reason] => Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [status] in order to load field data by uninverting the inverted index. Note that this can use significant memory.

Любая помощь мне игнорировать индексы, где это поле недоступно, или какое-либо другое решение этой проблемы?

1 Ответ

2 голосов
/ 27 мая 2020

Как обсуждалось в чате, проблема возникла из-за того, что @ jile sh

забыл удалить старое сопоставление индекса и обновил только те данные, что это происходило.

Нижеприведенный ответ актуален, когда вы получаете ошибку ниже при правильной настройке

Текстовые поля не оптимизированы для операций, требующих данных полей для каждого документа, таких как агрегирование и сортировка, поэтому эти операции по умолчанию отключено. Вместо этого используйте поле ключевого слова. В качестве альтернативы установите fielddata = true в [status], чтобы загрузить данные поля путем отмены инвертирования инвертированного индекса. Обратите внимание, что это может использовать значительный объем памяти.

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

Подробнее о данных поля на официальном сайте .

Вы можете включить его в поле order в вашем сопоставлении, как показано.

{
  "properties": {
    "order": { 
      "type":     "text",
      "fielddata": true
    }
  }
} 
...