我正在进行弹性搜索多字段排序查询,我有以下格式的数据:
{
"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
的类型为text
,created_on
的类型为string
。我必须根据字段person_name
和created_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
字段上执行排序查询而不改变弹性搜索的现有映射?
任何帮助将不胜感激。
答案 0 :(得分:4)
有两种方法可以满足您的需求。
raw
字段将不会被分析,这意味着它将是一个术语,因此它可以用于排序。为了做到这一点,你必须更新你的映射,然后使用reindex api来更新你的数据(你基本上创建一个新的索引,然后切换你的应用程序,使用新的索引,而不是旧的,在为了在没有停机的情况下执行此操作,您可以使用alias)。另一种更新索引而不创建新索引的方法是使用update_by_query api。所有链接都指向elasticsearch的官方文档。