我正在尝试在ElasticSearch 7.1中按数组大小排序。
我索引了以下数据,而没有创建任何自定义映射:
{
"myarray": [{
"field": {
"value": "test"
}
}]
}
当我看映射时,它给了我:
{
"properties": {
"myarray": {
"properties": {
"field": {
"properties": {
"value": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
}
现在我想查询索引并按myarray
中元素数量最多的排序。我试过了:
{
"sort": {
"_script": {
"type": "number",
"order": "desc",
"script": "doc.containsKey('myarray.field.value') ? doc['myarray.field.value'].values.size() : 0"
}
}
}
给了我一个类似Fielddata is disabled on text fields by default.[...] Alternatively use a keyword field instead
的错误。所以我试着用
{
"sort": {
"_script": {
"type": "number",
"order": "desc",
"script": "doc.containsKey('myarray.field.value.keyword') ? doc['myarray.field.value.keyword'].values.size() : 0"
}
}
}
给了我错误Illegal list shortcut value [values].
。然后我尝试了(删除values
关键字):
{
"sort": {
"_script": {
"type": "number",
"order": "desc",
"script": "doc.containsKey('myarray.field.value.keyword') ? doc['myarray.field.value.keyword'].size() : 0"
}
}
}
,它的工作原理,但是我有一些结果排序很好,突然一个元素,应该在顶部出现在中间。这是因为它是由value
的长度排序作为一个字符串,而不是myarray
的长度?
这是因为text类型映射不提供排序,要添加排序,必须用关键字映射数组字段。类型。更多信息和语法请参考:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-request-sort.html