如何对字段类型进行排序'' text"在弹性搜索中

时间:2018-04-05 12:31:51

标签: node.js amazon-web-services elasticsearch

我正在进行弹性搜索多字段排序查询,我有以下格式的数据:

{
  "person_name" : "Abraham Benjamin deVilliers",
  "created_on": "Tue, 02 Apr 2018 16: 17: 54 GMT",
  "name": "Abraham",
  "office":{
     "name":"my_office"
  }
},
{
  "person_name" : "John Bradshaw",
  "created_on": "Thu Apr 05 2018 14:42:30 GMT",
  "name": "jhon",
  "office": {
     "name":"Abraham deVilliers"
  }
},
{
  "person_name" : "John Bradshaw",
  "created_on": "Tue, 03 Apr 2018 11: 39: 17 GMT",
  "name": "Abraham deVilliers",
  "office": {
     "name":"blabla"
  }
}

字段person_name的类型为textcreated_on的类型为string。我必须根据字段person_namecreated_on对上述回复进行排序。

我们尝试的查询如下:

GET /my_index/_search

{
    sort: [{ 
             "person_name": { "order": "asc" },
             "created_on": { "order": "desc" }
    }]
}

在使用上述查询排序响应时,我收到以下错误:

  

消息:' [illegal_argument_exception]在文本上禁用Fielddata   默认情况下的字段在[person_name]上设置fielddata = true以便   通过反转索引来加载内存中的fielddata。注意   然而,这可能会占用大量内存。或者使用关键字   而是字段。'

在搜索时,我们发现我们需要修改字段person_name从类型text到类型keyword的映射。但我们无法修改现有的映射,因为它已包含数百万条记录。

有没有其他方法可以在text字段上执行排序查询而不改变弹性搜索的现有映射?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

有两种方法可以满足您的需求。

  1. 添加新字段multi-fields。使用多字段时,每次索引新字段时,elasticsearch都会自动为您引用的字段应用不同的分析器逻辑。 raw字段将不会被分析,这意味着它将是一个术语,因此它可以用于排序。为了做到这一点,你必须更新你的映射,然后使用reindex api来更新你的数据(你基本上创建一个新的索引,然后切换你的应用程序,使用新的索引,而不是旧的,在为了在没有停机的情况下执行此操作,您可以使用alias)。另一种更新索引而不创建新索引的方法是使用update_by_query api
  2. 如果您只是希望此类工作而不更改任何内容,则可以使用scripting。基本上,您将选择保存的值并根据它进行排序。但这不适合长期使用。这很快,很脏,所以小心对待。
  3. 所有链接都指向elasticsearch的官方文档。