ES: Сортировать по дате. Поле обязательно для включения. - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь получить все совпадения индекса, отсортированные по полю updated_at.

Однако, это терпит неудачу со следующим сообщением: "{"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"Fielddata is disabled on text fields by default. Set fielddata=true on [updated_at] in order to load fielddata in memory by uninverting the inverted index.

Это отображение, которое я использую:

Map::create($this->getModelType(), function (Blueprint $map) {
            $map->integer('id');
            $map->addField('text', 'title');
            $map->date('created_at')->format('yyyy-MM-dd HH:mm:ss');
            $map->date('updated_at')->format('yyyy-MM-dd HH:mm:ss');
            $map->date('deleted_at')->format('yyyy-MM-dd HH:mm:ss');
}));

и это код для получения всех данных, отсортированных по полю updated_at:

 $titleData = $this->title->search()->sortBy('updated_at', 'DESC');

Есть идеи?

1 Ответ

0 голосов
/ 16 сентября 2018

Похоже, что в ElasticSearch индекс updated_at сохраняется как текст .Текстовые поля анализируются и, как правило, ElasticSearch не могут сортировать по этим полям, потому что fielddata по умолчанию отключена в текстовых полях .

Чтобы преодолеть это, вы можете создать mapping с ключевым словом тип.Это может выглядеть так:

"updated_at": {
  "type": "text", // assuming you originally have it as text
  "fields": {
    "original": "keyword",
    "ignore_above": 64 // You can skip or change it and ES applies default value. 
  }
}

И тогда вы должны использовать отображение для сортировки.Вы можете получить к нему доступ так: updated_at.original.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...