php - ES:按日期排序字段需要启用fielddata

标签 php laravel elasticsearch

我正在尝试获取按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');

有任何想法吗?

最佳答案

似乎在ElasticSearch索引中,updated_at被存储为text。分析文本字段,通常ElasticSearch无法按这些字段排序,因为fielddata is disabled on text fields by default

为了克服它,您可以使用mapping类型创建keyword。它可能看起来像这样:

"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

关于php - ES:按日期排序字段需要启用fielddata,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52343745/

相关文章:

php - 使用 MYSQL DB 迁移网站后,网站 (PHP) 显示错误。错误是什么意思?

php - 将角色附加到用户 - Laravel

javascript - 将 Laravel 数据传递给 Vue 组件

ElasticSearch + Logstash 工作,但不显示任何数据

elasticsearch - elasticsearch中的跨数据中心复制策略

elasticsearch - Elasticsearch Analyzer继承

php - 在php中访问不带方括号的数组值

php - 为什么我在 GD 饼图中看到这条奇怪的线?

php - 路由中的 Laravel 多个中间件具有 OR 条件

php - 拉维尔 4 : Queues and Multiple Listeners