2014-09-23 63 views
0

我有一個查詢,像這樣:Elasticsearch排序

{ 
    "sort": [ 
     { 
      "_geo_distance": { 
       "geo": { 
        "lat": 39.802763999999996, 
        "lon": -105.08748399999999 
       }, 
       "order": "asc", 
       "unit": "mi", 
       "mode": "min", 
       "distance_type": "sloppy_arc" 
      } 
     } 
    ], 
    "query": { 
     "bool": { 
      "minimum_number_should_match": 0, 
      "should": [ 
       { 
        "match": { 
         "name": "" 
        } 
       }, 
       { 
        "match": { 
         "credit": true 
        } 
       } 
      ] 
     } 
    } 
} 

我想我的搜索總是返回所有結果,剛剛整理與那些有匹配的標誌更靠前。

我想分類優先級去是這樣的:

  1. SEARCHTERM(姓名,字符串)
  2. 標誌(信用卡/ ATM/ADA /等,布爾值)
  3. 距離

這是如何實現的?

到目前爲止,您在上面看到的查詢是我所得到的。我一直無法弄清楚如何總是返回所有結果,也不知道如何將附加查詢合併到排序中。

+0

您的要求有點混亂。你說那些「有匹配的標誌」應該是「更接近頂部」。但是,您的排序優先級將「名稱」作爲排序標準。那麼,它應該首先找到所有匹配的名稱,然後考慮匹配標誌的數量(更多匹配標誌越好)?假設你想要搜索一家銀行分行 - 你想要的名字比分行具有「信用」功能,「atm」功能的事實更匹配?或者你想找到具有「良好」名稱和一些「好」功能的分支機構?這意味着名稱和這些功能有多重要? – 2014-09-24 08:57:56

回答

1

我不相信「排序」是你正在尋找的答案,實際上。我相信你需要一個試驗和錯誤的方法,從一個簡單的「bool」查詢開始,在其中放置所有標準(名稱,標誌,距離)。然後你給你的名字標準更多的重量(提升),然後少一點你的旗幟,甚至更少的距離計算。

「bool」「應該」能夠根據每個文件的_score給出一個排序的文檔列表,並且根據您對每個標準的評分方式,_score會或多或少地受到影響。另外,返回所有元素並不困難:只需在您的「bool」「should」查詢中添加一個"match_all": {}即可。

從我的角度來看,這將是一個起點,並且根據您的文檔和您的要求(請參閱我對您的帖子有關混淆的評論),您需要調整「提升」值並進行測試,再次調整並再次測試等:

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { "constant_score": { 
      "boost": 6, 
      "query": { 
       "match": { "name": { "query": "something" } } 
      } 
     }}, 
     { "constant_score": { 
      "boost": 3, 
      "query": { 
       "match": { "credit": { "query": true } } 
      } 
     }}, 
     { "constant_score": { 
      "boost": 3, 
      "query": { 
       "match": { "atm": { "query": false } } 
      } 
     }}, 
     { "constant_score": { 
      "boost": 3, 
      "query": { 
       "match": { "ada": { "query": true } } 
      } 
     }}, 
     { "constant_score": { 
      "query": { 
       "function_score": { 
       "functions": [ 
        { 
        "gauss": { 
         "geo": { 
         "origin": { 
          "lat": 39.802763999999996, 
          "lon": -105.08748399999999 
         }, 
         "offset": "2km", 
         "scale": "3km" 
         } 
        } 
        } 
       ] 
       } 
      } 
      } 
     }, 
     { 
      "match_all": {} 
     } 
     ] 
    } 
    } 
}