2016-02-19 46 views
1

我有一個工作Elasticsearch查詢,看起來像這樣:Elasticsearch - 基於現場的具體價值提升文檔

{ 
    "index": "event", 
    "type": "item", 
    "body": { 
     "query": { 
      "filtered": { 
       "query": { 
        "multi_match": { 
         "query": "party", 
         "type": "phrase_prefix", 
         "fuzziness": null, 
         "fields": [ 
          "label^2", 
          "excerpt", 
          "body" 
         ] 
        } 
       }, 
       "filter": { 
        "bool": { 
         "must": [ 
          { 
           "term": { 
            "is_deleted": false 
           } 
          }, 
          { 
           "term": { 
            "is_private": false 
           } 
          }, 
          { 
           "range": { 
            "date_start": { 
             "gt": "now" 
            } 
           } 
          } 
         ] 
        } 
       } 
      } 
     } 
    } 
} 

此查詢匹配的關鍵字搜索的事件搜索,是由於在未來和過濾器啓動將任何標記爲已刪除或私人。

每個可以創建事件的用戶也可以向系統購買軟件包。我想提高包裹價值更高的用戶。我相信我需要使用Function Score Query來實現一個自定義的得分功能,但是我無法在文檔中找到自己的頭,並且盲目地嘗試它並沒有讓我獲得任何地方。

舉個例子,索引的文檔可能是這樣的:

[ 
    { 
     "label": "My Birthday Party", 
     "excerpt": "Come celebrate with me as I turn 30", 
     "body": "I'm turning 30 soon, let's go dancing!", 
     "date_start": "2016-06-19", 
     "is_deleted": false, 
     "is_private": false, 
     "user": { 
      "id": 1, 
      "name": "Pablo", 
      "package": { 
       "id": 14, 
       "cost": "1000", 
       "label": "The \"£10 per month\" package" 
      } 
     } 
    }, 
    { 
     "label": "House Warming Party", 
     "excerpt": "I moved house, help me decorate it", 
     "body": "I love my new house, but it's empty and I have no furniture.", 
     "date_start": "2016-04-19", 
     "is_deleted": false, 
     "is_private": false, 
     "user": { 
      "id": 2, 
      "name": "Gary", 
      "package": { 
       "id": 15, 
       "cost": "5000", 
       "label": "The \"£50 per month\" package" 
      } 
     } 
    } 
] 

在其返回這兩個結果的查詢,我怎麼可能在巴勃羅的生日優先考慮窮人加里(誰需要幫助裝潢)的基礎上, Gary的套餐價值較高(即user.package.cost)。

在其他方面平等的搜索,加里的結果必須第一。

任何指針?

謝謝。

回答

2

使用script score來實現此目的。

"query": { 
    "function_score": { 
    "query": { 
     "match_all": {} 
    }, 
    "functions": [ 
     { 
      "script_score": { 
       "script": "_score * doc['user.package.cost'].value" 

      } 
     } 
     ] 
    } 
} 

希望它可以幫助..

+0

謝謝@richa - 讓我在正確的軌道上!需要啓用[常規]搜索,但是一旦我解決了這個問題,我就可以很好地工作。 – HelloPablo

+0

我在努力編寫一個適當的腳本,它首先檢查user.package是否存在(對於沒有包的用戶它可以爲null)。 'packageCost = doc ['user.package']。值的變化? doc ['user.package.cost']。value:1;返回packageCost * _score'給我[不是]常規錯誤 - 任何指針? – HelloPablo