我正在使用Lucene开发商店搜索API。
我需要显示每个城市的商店搜索结果,状态组合及其频率在括号中....例如:
Los Angles,CA (450)
Atlanta,GA (212)
Boston, MA (78)
.
.
.
截至目前,如果用户说“向我展示所有商店”,我的搜索结果平均会返回7000个Lucene文档。 在这个用例中,我最终显示了大约800个独特的城市,州记录,如上所示。
我正在覆盖HitCollector
类的Collect
方法并检索向量,如下所示:
var vectors = _reader.GetTermFreqVectors(doc);
然后我遍历这个集合并计算每个独特城市,州组合的频率。
但事实证明,这在性能上非常缓慢......有没有更好的方法将搜索结果分组并计算Lucene的频率? 代码片段非常有用
此外,请建议我是否可以使用任何其他技巧/提示优化我的Lucene搜索代码....
感谢阅读!
答案 0 :(得分:3)
我不相信你现在可以在Lucene做这个OOTB - 搜索这个功能会产生这个未解决的问题:
然而,功能与Solr一起出现OOTB - 它提供了一个分面功能。查询如下:
将返回以下结果:
<response>
<responseHeader><status>0</status><QTime>2</QTime></responseHeader>
<result numFound="4" start="0"/>
<lst name="facet_counts">
<lst name="facet_queries"/>
<lst name="facet_fields">
<lst name="cat">
<int name="search">0</int>
<int name="memory">0</int>
<int name="graphics">0</int>
<int name="card">0</int>
<int name="music">1</int>
<int name="software">0</int>
<int name="electronics">3</int>
<int name="copier">0</int>
<int name="multifunction">0</int>
<int name="camera">0</int>
<int name="connector">2</int>
<int name="hard">0</int>
<int name="scanner">0</int>
<int name="monitor">0</int>
<int name="drive">0</int>
<int name="printer">0</int>
</lst>
<lst name="inStock">
<int name="false">3</int>
<int name="true">1</int>
</lst>
</lst>
</lst>
</response>
有关分面的更多信息,请访问Solr网站:
http://wiki.apache.org/solr/SimpleFacetParameters
编辑:如果您绝对不想将SOLR方法转变为面向您,那么您可以利用Lucene所描述的此补丁中的功能:
http://sujitpal.blogspot.com/2007/01/faceted-searching-with-lucene.html
通过补丁在Lucene 2.0之上提供了分面功能的实现。
答案 1 :(得分:0)
我不确定我是否理解“分组”的含义,但如果您只想计算每个类别的文档数量,则应该查看this question。
我的回答仍然存在,强硬的人似乎不足以支持我...
答案 2 :(得分:0)