当前位置:  开发笔记 > 编程语言 > 正文

使用Lucene计算类别中的结果

如何解决《使用Lucene计算类别中的结果》经验,为你挑选了2个好方法。

我正在尝试使用Lucene Java 2.3.2来实现对产品目录的搜索.除了产品的常规字段外,还有一个名为"类别"的字段.产品可以分为多个类别.目前,我使用FilteredQuery搜索每个类别的相同搜索词,以获得每个类别的结果数.

这导致每个查询20-30个内部搜索调用以显示结果.这大大减慢了搜索速度.使用Lucene有更快的方法来实现相同的结果吗?



1> itsadok..:

这就是我做的,虽然它对内存有点沉重:

你需要的是提前创建一堆BitSets,每个类别一个,包含一个类别中所有文档的doc id.现在,在搜索时,您使用HitCollector并检查针​​对BitSet的文档ID.

这是创建位集的代码:

public BitSet[] getBitSets(IndexSearcher indexSearcher, 
                           Category[] categories) {
    BitSet[] bitSets = new BitSet[categories.length];
    for(int i=0; i

这只是一种方法.如果您的类别足够简单,您可以使用TermDocs而不是运行完整搜索,但这应该只在您加载索引时运行一次.

现在,在计算搜索结果类别时,您可以这样做:

public int[] getCategroryCount(IndexSearcher indexSearcher, 
                               Query query, 
                               final BitSet[] bitSets) {
    final int[] count = new int[bitSets.length];
    indexSearcher.search(query, new HitCollector() {
        public void collect(int doc, float score) {
            for(int i=0; i

您最终得到的是一个数组,其中包含搜索结果中每个类别的计数.如果您还需要搜索结果,则应该向命中收集器添加TopDocCollector(yo dawg ...).或者,您可以再次运行搜索.2次搜索优于30次.



2> Rowan..:

我没有足够的声誉来评论(!)但是在Matt Quail的回答中我很确定你可以替换它:

int numDocs = 0;
td.seek(terms);
while (td.next()) {
    numDocs++;
}

有了这个:

int numDocs = terms.docFreq()

然后完全摆脱td变量.这应该会更快.

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有