3

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

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

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

到目前为止,如果用户说“显示所有商店”,我的搜索结果平均会返回大约 7000 个 Lucene 文档。在这个用例中,我最终显示了大约 800 个独特的 City,State 记录,如上所示。

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

var vectors = _reader.GetTermFreqVectors(doc);

然后我遍历这个集合并计算每个唯一城市、州组合的频率。

但这在性能上变得非常非常缓慢......有没有更好的方法来分组搜索结果和计算 Lucene 中的频率?一个代码片段会很有帮助

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

谢谢阅读!

4

3 回答 3

3

我不相信您目前可以在 Lucene 中执行此 OOTB - 搜索此功能会产生此未解决的问题:

Jira Lucene 功能请求

然而,该功能存在于 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 之上提供了 faceting 功能的实现。

于 2009-04-11T04:46:54.363 回答
0

史蒂夫,我相信你想要多面搜索。它不是开箱即用的 Lucene。我建议您尝试使用SOLR,它具有刻面作为主要且方便的功能。

于 2009-04-12T10:11:06.900 回答
0

我不确定我理解您所说的“分组”是什么意思,但如果您只想计算每个类别的文档数量,您应该看看这个问题

我的答案仍然存在,似乎没有人喜欢它足以支持我......

于 2009-04-11T14:52:55.140 回答