浮动的弹性搜索排序看起来不对

pfe*_*rel 3 lucene elasticsearch

我在每个文档中都有一个包含Float的字段,这是一种订购文档的后备方式.由于它是浮点数,因此可以为负数.当我问Elasticsearch时,"order": "desc"我首先得到最大的负值,然后是负面的.这是错误的,就好像符号被忽略了,这根本不是我想要的.

"popRank": {
    "unmapped_type": "float",
    "order": "desc"
}
Run Code Online (Sandbox Code Playgroud)

doc的部分内容如下:

"popRank": -310,
Run Code Online (Sandbox Code Playgroud)

如果查询使用desc我先得到-310,然后是-157.不完全确定当存在正数时会发生什么,因为在这个小的测试数据集中没有任何数据.

Val*_*Val 5

首先,你需要确保你的popRank字段映射为floatstring

curl -XGET localhost:9200/your_index/_mapping/your_type?fields=popRank
Run Code Online (Sandbox Code Playgroud)

应该回复你:

{
  "your_index" : {
    "mappings" : {
      "your_type" : {
        "properties" : {
          "popRank" : {
            "type" : "float"         <---- "float" MUST appear here and NOT "string"
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我们可以非常简单地测试浮点排序.首先,让我们创建一个测试索引:

curl -XPOST localhost:9200/test -d '{
  "mappings": {
    "test": {
      "properties": {
        "popRank": {
          "type": "float"
        }
      }
    }
  }
}'
Run Code Online (Sandbox Code Playgroud)

然后我们popRank在整个频谱中添加一些文档.

curl -XPOST localhost:9200/test/test/_bulk -d '
{"index": {"_id": 1}}
{"popRank": 123}
{"index": {"_id": 2}}
{"popRank": -157}
{"index": {"_id": 3}}
{"popRank": 1234}
{"index": {"_id": 4}}
{"popRank": 0}
{"index": {"_id": 5}}
{"popRank": -310}
{"index": {"_id": 6}}
{"popRank": 332}
{"index": {"_id": 7}}
{"popRank": -10}
'
Run Code Online (Sandbox Code Playgroud)

最后,我们可以解决这个问题

curl -XPOST localhost:9200/test/test/_search -d '{
    "sort": {
        "popRank": {
            "unmapped_type": "float",
            "order": "desc"
        }
    },
    "query": {"match_all": {}}
}'
Run Code Online (Sandbox Code Playgroud)

在结果中,我看到所有文档都正确排序popRank,即1234, 332, 123, 0, -10, -157, -310

因此,请确保您的popRank字段首先没有被编入索引string,因为如果是这种情况,上面的示例文档将按照以下方式进行排序:332, -310, -157, 1234, 123, -10, 0这在您的案例中似乎正在发生.