将Lucene搜索结果分组并按类别计算频率

时间:2009-04-10 23:37:54

标签: performance lucene lucene.net

我正在使用Lucene开发商店搜索API。

我需要显示每个城市的商店搜索结果,状态组合及其频率在括号中....例如:

Los Angles,CA (450)
Atlanta,GA (212)
Boston, MA (78)
.
.
.

截至目前,如果用户说“向我展示所有商店”,我的搜索结果平均会返回7000个Lucene文档。 在这个用例中,我最终显示了大约800个独特的城市,州记录,如上所示。

我正在覆盖HitCollector类的Collect方法并检索向量,如下所示:

var vectors = _reader.GetTermFreqVectors(doc);

然后我遍历这个集合并计算每个独特城市,州组合的频率。

但事实证明,这在性能上非常缓慢......有没有更好的方法将搜索结果分组并计算Lucene的频率? 代码片段非常有用

此外,请建议我是否可以使用任何其他技巧/提示优化我的Lucene搜索代码....

感谢阅读!

3 个答案:

答案 0 :(得分:3)

我不相信你现在可以在Lucene做这个OOTB - 搜索这个功能会产生这个未解决的问题:

Jira Lucene Feature Request

然而,功能与Solr一起出现OOTB - 它提供了一个分面功能。查询如下:

http://localhost:8983/solr/select?q=ipod&rows=0&facet=true&facet.limit=-1&facet.field=cat&facet.field=inStock

将返回以下结果:

<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)

史蒂夫,我相信你想要faceted search。 Lucene没有开箱即用。 我建议您尝试使用SOLRfaceting作为主要且方便的功能。