lucene - Lucene:构面范围取决于返回的结果
问题描述
我有一个有效的搜索设置,我在其中给出了构面范围,并得到了正确的结果。问题是对于价格方面,我需要取决于返回的结果,所以我无法事先知道范围。
示例 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 的某个地方,我可以指定我希望范围基于搜索结果中的字段吗?
谢谢
解决方案
经过多次搜索,我没有找到开箱即用的方法。这样做的方法是扩展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);
推荐阅读
- django - 如何在 Django 中打开和渲染文件?
- php - 预期响应代码 250,但得到代码“554”,消息“554 消息被拒绝 | Laravel 使用 TO 电子邮件
- android - SDK工具和gradle的区别?
- javascript - CanvasJS(Fabric)在硬刷新(ctrl shift r)或首次以隐身模式加载时未正确加载
- python - 获取 Pandas DataFrame 列中每个单词的频率计数
- excel - 连续获取单元格 Excel Addin Nodejs Api
- r - 根据 R 中的年份将日期更改为 NA 值
- python - 外壳内的 Python 3.6 保存功能
- javascript - 你能解释一下这个反应函数吗?
- sql - 当两个日期之间的差值大于某个值时删除记录的 SQL 查询