Упругий поиск с использованием 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)
)
)
);