【问题标题】:Lucene: facet range depends on the returned resultsLucene:构面范围取决于返回的结果
【发布时间】:2020-03-13 13:40:20
【问题描述】:

我有一个有效的搜索设置,我在其中给出构面范围,并返回正确的结果。 问题是对于价格方面,我需要依赖于返回的结果,所以我不能事先知道范围。

示例 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 的某个地方我可以指定我希望范围基于搜索结果中的字段吗?

谢谢

【问题讨论】:

    标签: lucene lucene.net facet


    【解决方案1】:

    经过多次搜索,我没有找到开箱即用的方法。 这样做的方法是扩展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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多