由于空字符串,Elasticsearch排序失败

时间:2019-06-07 08:38:57

标签: elasticsearch

基本上,该字段的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"
}
}

}

1 个答案:

答案 0 :(得分:1)

elasticsearch使用的词汇顺序将空字符串排在第一位。要更改空字符串的顺序,您将必须使用自定义排序功能:

{
    "query" : {
        ...
    },
    "sort" : {
        "_script" : {
            "type" : "string",
            "script" : {
                "lang": "painless",
                "source": "doc['myflag.raw'].value == '' ? 'zzzzzzzz' : doc['myflag.raw'].value"
            },
            "order" : "asc"
        }
    }
}

此处'zzzzzzzz'对应于使用字母顺序的最后一个预期单词。我找不到另一种明确表示最后位置

的方法