2015-08-21 31 views
2

我在每個文檔中都有一個字段,其中包含一個浮點,這意味着作爲訂購文檔的備用方式。由於它是一個浮點數,它可能是負數。當我要求Elasticsearch到"order": "desc"時,我得到最大的負值,然後得到負值。這是錯誤的,就好像標誌被忽略了,這完全不是我想要的。Elasticsearch浮點排序順序看起來不對

"popRank": { 
    "unmapped_type": "float", 
    "order": "desc" 
} 

DOC的部分看起來像這樣:

"popRank": -310, 

如果查詢使用desc我得到-310第一,接下來-157。不完全確定當有正數時會發生什麼,因爲這個小測試數據集中沒有任何數據。

+0

看起來像是一個詞典排序檢查映射是'popRank'類型'浮動'或'字符串? – keety

回答

5

首先,你需要確保你的popRank字段映射爲float而不是string

curl -XGET localhost:9200/your_index/_mapping/your_type?fields=popRank 

應該回到你:

{ 
    "your_index" : { 
    "mappings" : { 
     "your_type" : { 
     "properties" : { 
      "popRank" : { 
      "type" : "float"   <---- "float" MUST appear here and NOT "string" 
      } 
     } 
     } 
    } 
    } 
} 

我們可以測試浮動很單純地喜歡這個排序。首先,讓我們創建一個測試指標:

curl -XPOST localhost:9200/test -d '{ 
    "mappings": { 
    "test": { 
     "properties": { 
     "popRank": { 
      "type": "float" 
     } 
     } 
    } 
    } 
}' 

然後我們在整個光譜增加了一些文檔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} 
' 

最後,我們可以用

curl -XPOST localhost:9200/test/test/_search -d '{ 
    "sort": { 
     "popRank": { 
      "unmapped_type": "float", 
      "order": "desc" 
     } 
    }, 
    "query": {"match_all": {}} 
}' 

動搖了這一點,在結果中,我看到popRank正確排序的所有文件,即1234, 332, 123, 0, -10, -157, -310

因此,請確保您的popRank場並沒有被索引爲string,因爲如果是這種情況,上面的示例文檔將按照如下排序:332, -310, -157, 1234, 123, -10, 0,這似乎正在發生在你的情況。

+0

你說得對,popRank被映射爲一個字符串。它通過Spark使用Map [String,Any]寫入索引。該地圖的一部分是「popRank」 - > n,其中n是一個Float。使用'rdd [Map [String,Any]]將整個索引寫入ES。saveToEs(esIndexURI,Map(「es.mapping.id」 - >「id」)'零件「es.mapping.id」 - > id「告訴ES使用rdd的」MAP「中的」id「關聯作爲doc-id。是否有某種方法可以將popRank映射到一個浮點數,我認爲它可以從反射來確定這個值,但也許不會。 – pferrel

+0

I真的很感謝你已經完全解決了這個問題,我將這個標記爲答案,但是我沒有看到上面的解決方案。如何使用'rdd.saveAsEs(index,mappings)'我可以寫popRank映射到一個Float ? – pferrel

+0

我認爲最後一點是在索引創建時創建字段類型映射,然後一切都很好,謝謝 – pferrel