2014-05-06 50 views
3

我目前正試圖在NEST中實現一個「function_score」查詢,只有在過濾器匹配時纔會應用這些函數。elasticsearch巢功能函數中的過濾器支持

它看起來不像FunctionScoreFunctionsDescriptor支持添加過濾器。這個功能是否會很快被添加?



這裏是想我能夠實現一個超級簡單的例子:

  1. 運行的ES查詢,基本分數
  2. 經歷的功能列表,並添加它的第一次得分,其中過濾器匹配我目前使用Elasticsearch V1.1.0
"function_score": { 
    "query": {...}, // base ES query 
    "functions": [ 
     { 
      "filter": {...}, 
      "script_score": {"script": "25"} 
     }, 
     { 
      "filter": {...}, 
      "script_score": {"script": "15"} 
     }  
    ], 
    "score_mode": "first", // take the first script_score where the filter matches 
    "boost_mode": "sum" // and add this to the base ES query score 
} 

,和NEST v 1.0.0-beta1預發佈。

謝謝!

回答

4

它已經實現:

_client.Search<ElasticsearchProject>(s => 
      s.Query(q=>q 
       .FunctionScore(fs=>fs.Functions(
        f=>f 
         .ScriptScore(ss=>ss.Script("25")) 
         .Filter(ff=>ff.Term(t=>t.Country, "A")), 
        f=> f 
         .ScriptScore(ss=>ss.Script("15")) 
         .Filter(ff=>ff.Term("a","b"))) 
       .ScoreMode(FunctionScoreMode.first) 
       .BoostMode(FunctionBoostMode.sum)))); 
+0

爾加,不知道我是多麼懷念那。我已經嘗試過,它的工作原理。太棒了,謝謝! – IBN

2

的烏迪的回答並沒有爲我工作。看來在新版本(v 2.3,C#)中,ScoreFunctionsDescriptor類沒有Filter()方法。

但我找到了解決方案。您可以提供一組IScoreFunction。要做到這一點,您可以使用new FunctionScoreFunction()或使用我的輔助類:

class CustomFunctionScore<T> : FunctionScoreFunction 
    where T: class 
{ 
    public CustomFunctionScore(Func<QueryContainerDescriptor<T>, QueryContainer> selector, double? weight = null) 
    { 
     this.Filter = selector.Invoke(new QueryContainerDescriptor<T>()); 
     this.Weight = weight; 
    } 
} 

有了這個類,過濾器可以應用這種方式(這只是一個例子):

 SearchDescriptor<BlobPost> searchDescriptor = new SearchDescriptor<BlobPost>() 
      .Query(qr => qr 
       .FunctionScore(fs => fs 
        .Query(q => q.Bool(b => b.Should(s => s.Match(a => a.Field(f => f.FirstName).Query("john"))))) 
        .ScoreMode(FunctionScoreMode.Max) 
        .BoostMode(FunctionBoostMode.Sum) 
        .Functions(
         new[] 
         { 
          new CustomFunctionScore<BlobPost>(q => q.Match(a => a.Field(f => f.Id).Query("my_id")), 10), 
          new CustomFunctionScore<BlobPost>(q => q.Match(a => a.Field(f => f.FirstName).Query("john")), 10), 
         } 
        ) 
       ) 
      ); 
+0

這是我用Nest的最新版本(2.x及更高版本)找到的唯一解決方案。但我們過去可以用逗號分隔多個功能。您提供的解決方案很好,但不便於添加對我來說很重要的條件邏輯。 – bigerock