2013-01-16 15 views
8

NESTの厳密に型指定されたクライアントを使用してC#でElastic Searchを使用しています。NESTフィールドブーストを使用した弾性検索

[ElasticType(Name = "Entry", IdProperty = "Id")] 
public class Entry 
{ 
    public string Id { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public string Award { get; set; } 
    public int Year { get; set; } 
} 

年は例えば2012、エントリーの年であり、そして賞はエントリがNULLであることができる、獲得した賞の種類である: 私はエントリを含むインデックスを持っています。

次に、さまざまなプロパティのブースティングを使用してこれらのエントリを検索したいとします。次のコードでは、説明で一致する結果よりも、タイトルで一致する結果のランク付けを高くしたいと考えています。

private IQueryResponse<Entry> GetMatchedEntries(string searchText) 
{ 
    return _elasticClient.Search<Entry>(
       body => 
       body.Query(q => 
          q.QueryString(qs => 
             qs.OnFieldsWithBoost(d => 
                   d.Add(entry => entry.Title, 5.0) 
                   .Add(entry => entry.Description, 2.0)) 
          .Query(searchText)))); 
} 

私は今、賞を受賞しているもので、結果をブーストし、また、(年によって)新しいエントリを後押しするように求めてきました。

どうすればよいですか?インデックスサービスの一環として、または検索の一環として行う必要があるのでしょうか?

答えて

12

ので、あなたがboostingクエリとcustom_scoreクエリ

の代わりに、私たちは年に基づいてスコアを変更する年を高めるの組み合わせによってこれを達成することができます:新しい結果がトップにフロートします

(_score + 2013) > (_score + 1999) 

ブースティングクエリを使用すると、賞のフィールドがない結果を効果的に降格できます。

は、以下を参照してください。このマルタインを投稿するための http://www.elasticsearch.org/guide/reference/query-dsl/boosting-query.html http://www.elasticsearch.org/guide/reference/query-dsl/custom-score-query.html

_client.Search<Entry>(s=>s 
    .Query(q =>q 
     .Boosting(bq=>bq 
      .Positive(pq=>pq 
       .CustomScore(cbf=>cbf 
        .Query(cbfq=>cbfq 
         .QueryString(qs => qs 
          .OnFieldsWithBoost(d => 
           d.Add(entry => entry.Title, 5.0) 
           .Add(entry => entry.Description, 2.0) 
          ) 
          .Query(searchText) 
         ) 
        ) 
        .Script("_score + doc['year'].value") 
       ) 
      ) 
      .Negative(nq=>nq 
       .Filtered(nfq=>nfq 
        .Query(qq=>qq.MatchAll()) 
        .Filter(f=>f.Missing(p=>p.Award)) 
       ) 
      ) 
      .NegativeBoost(0.2) 
     ) 
    ) 
); 
+0

感謝を - 現在のドキュメントよりも間違いなく、より便利。 –

+1

これは、Elasticsearch <1.0でのみ動作することに注意してください。 Elasticsearch> = 1.0ではなく、function scoreクエリを使用する必要があります。 https://www.elastic.co/guide/en/elasticsearch/reference/0.90/query-dsl-function-score-query.html。 https://www.elastic.co/guide/en/elasticsearch/reference/0.90/query-dsl-function-score-query.htmlの解決策も参照してください。 –

関連する問題