基本上,该字段的json结构如下:
"myflag": {
"type": "text",
"fields": {
"raw": {
"type": "keyword",
"normalizer": "case_insensitive"
}
}
}
如果我有这5个条目:
A
a
B
C
它们将正确排序,这意味着:
A
a
B
C
还有1行带有空值。
但是,好像没有设置空行(对此很确定)。它为null或未定义。 在这种情况下,排序效果很好。
但是,一旦我用一个值更改空行然后又将其清除,则排序将不正确。
因此,例如,在上面的示例中,我将值设置为空值,因此在db的结尾处有以下内容:
A
a
B
Z
C
排序仍然正确,显示:
A
a
B
C
Z
但是,一旦我清除了条目中的值,该条目就会在列表中排在第一位。因此,如果我清除了前Z的值,排序将给我:
(EMPTY)
A
a
B
C
EMPTY行排在第一位。 是否有另一个参数需要添加到架构?
运行
http://127.0.0.1:9200/tambur/_settings
给出以下内容:
analysis: {
normalizer: {
case_insensitive: {
filter: "lowercase"
}
}
}
答案 0 :(得分:1)
elasticsearch使用的词汇顺序将空字符串排在第一位。要更改空字符串的顺序,您将必须使用自定义排序功能:
{
"query" : {
...
},
"sort" : {
"_script" : {
"type" : "string",
"script" : {
"lang": "painless",
"source": "doc['myflag.raw'].value == '' ? 'zzzzzzzz' : doc['myflag.raw'].value"
},
"order" : "asc"
}
}
}
此处'zzzzzzzz'
对应于使用字母顺序的最后一个预期单词。我找不到另一种明确表示最后位置