10

NESTの強い型のクライアントを使用してC#でElasticSearchを使用しています。エントリを含むインデックスがあります。

[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; }
}

ここで、Yearはエントリの年(例:2012)であり、Awardはエントリが獲得したAwardのタイプであり、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))));
}

私は今、賞を受賞した人たちから結果を後押しし、また新しいエントリーを後押しするように頼まれました(つまり、年ごとに)。

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

4

1 に答える 1

12

boostingこれは、クエリとcustom_scoreクエリの組み合わせによって実現できます

年をブーストする代わりに、次の理由で年に基づいてスコアを変更します。

(_score + 2013) > (_score + 1999)

新しい結果は一番上に表示されます。

ブースティングクエリを使用することで、アワードフィールドが欠落している結果を効果的に降格できます。

参照: https ://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-boosting-query.html https://www.elastic.co/guide/en/elasticsearch/reference/current /query-dsl-function-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)
        )
    )
);
于 2013-01-17T11:42:04.820 に答える