Lucene: диапазон граней зависит от возвращаемых результатов - PullRequest
0 голосов
/ 13 марта 2020

У меня настроен рабочий поиск, в котором я задаю диапазон фасетов и получаю верные результаты. Проблема заключается в том, что для ценового фасета мне нужно зависеть от возвращаемого результата, поэтому я не могу заранее знать диапазоны.

Пример 1: в результате поиска было найдено 4 товара со следующими ценами: 20, 30 , 40, 55. Поэтому я ожидаю, что грани будут выглядеть примерно так:

0 - 20 (1)
21 - 40 (2)
41 - 60 (1)

Пример 2: в результате поиска найдено 2 продукта со следующими ценами: 200, 400, поэтому я ожидаю, что грани будут выглядеть примерно так :

100 - 200 (1)
300 - 400 (1)

Есть ли где-нибудь в Lucene, где я могу указать, что я хочу, чтобы диапазоны основывались на поле из результатов поиска?

Спасибо

1 Ответ

0 голосов
/ 25 марта 2020

После долгих поисков я не нашел способа сделать это из коробки. Способ сделать это - расширить DrillSideways, и в начале метода BuildFacetsResult мы извлекаем поле с необходимым значением. Примерно так:

public class DrillSidewaysHelper : DrillSideways
{
    private TopFieldCollector _localCollector;
    private List<decimal> _prices;
    protected override LuceneFacets BuildFacetsResult(FacetsCollector drillDownCollector, FacetsCollector[] drillSidewaysCollectors,
            string[] drillSidewaysFacets)
    {
       ExtractResults(); //here we extract the methods from the _localCollector and populate _prices
        ....here we can generate the facets range based on the _prices

    }

    public FacetResultSet<T> OurSearch(DrillDownQuery drillDownQuery, Sort sort)
    {
        int limit = m_searcher.IndexReader.MaxDoc;

        _localCollector = TopFieldCollector.Create(sort, limit, null, true, true, false, true);
        var drillSidewaysResult = Search(drillDownQuery, _localCollector);

        var facets = ExtractFacets(drillSidewaysResult.Facets);

        return new FacetResultSet<T>(_results, (uint) _localCollector.TotalHits, facets);
    }
}

и использование:

var drillSideways = new DrillSidewaysHelper(searcher, facetsConfig, taxonomyReader);

return drillSideways.OurSearch(drillDownQuery, sort);
...