Упругий поиск с использованием NEST Field Boosting

Я использую Elastic Search в C# с помощью строго типизированного клиента 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; }
}

Где Year - это год заявки, например 2012, а Award - это тип награды, которую выиграла заявка, которая может быть нулевой.

Затем я хочу найти эти записи, используя повышение для различных свойств. В следующем коде я хочу, чтобы результаты оценивались выше, чем в заголовке, чем те, которые соответствуют в описании.

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

Теперь меня попросили повысить результаты тех, кто получил награды, а также повысить новые заявки (например, к году).

Как мне это сделать? Это нужно сделать как часть службы индексации или как часть поиска?

1 ответ

Решение

Вы можете достичь этого с помощью комбинации 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)
        )
    )
);
Другие вопросы по тегам