Java Lucene 3对所有点击进行迭代

Java Lucene 3对所有点击进行迭代,java,lucene,Java,Lucene,我正在更新一个使用Lucene索引的工具。作为此次更新的一部分,我们将从Lucene 2.0.0迁移到3.0.2。在大多数情况下,这是完全直截了当的。然而,在一个例子中,我似乎找不到一个简单的转换 基本上我有一个简单的查询,我需要迭代所有的点击。在Lucene 2中,这很简单,例如: Hits hits = indexSearcher.search(query); for(int i=0 ; i<hits.length() ; i++){ // Process hit } 这个很好,

我正在更新一个使用Lucene索引的工具。作为此次更新的一部分,我们将从Lucene 2.0.0迁移到3.0.2。在大多数情况下,这是完全直截了当的。然而,在一个例子中,我似乎找不到一个简单的转换

基本上我有一个简单的查询,我需要迭代所有的点击。在Lucene 2中,这很简单,例如:

Hits hits = indexSearcher.search(query);
for(int i=0 ; i<hits.length() ; i++){
  // Process hit
}
这个很好,除了那个

a)如果点击次数比最大点击次数多怎么办

b)如果最大点击量很大,那么我会浪费内存,因为在执行搜索之前会为每个点击分配空间


由于大多数情况下只会有少量点击,我不介意进行后续搜索以获得后续点击,但我似乎找不到这样做的方法。

为什么不使用Searcher.search(Query-Query,int-n)?您可以指定想要返回的结果的数量,并且可以使用返回的TopDocs对象来迭代结果

使用Hits来处理长的结果集是一个坏主意,因为在后台,Hits对象将运行更多的搜索来填充它还没有的结果


TopDocs只包含ID和分数,因此即使是大n,也不应该有内存问题。

使用索引读取器中的NumDocs作为最大结果数如何

但是要注意索引中零文档的边缘情况


希望这有帮助,

IndexSearcher有一个方法
docFreq(Term)
。调用它似乎不会对性能造成影响,并且它的输出是要获取的文档数量的合适输入参数

例如

intfreq=searcher.docFreq(新术语(字段,值));
TopDocs hits=indexSearcher.search(查询,频率);

对于(int i=0;i@Kris-我也遇到了这个问题,这对我很有用。试试这个:

TopDocs tp = ms.search(query, 1); 

TopDocs hits = indexSearcher.search(query, tp.totalHits);
for (int i=0 ; i<hits.totalHits ; i++) {
   // Process hit
}
TopDocs tp=ms.search(查询,1);
TopDocs hits=indexsearch.search(查询,tp.totalHits);

对于(int i=0;这基本上就是我目前正在做的。但是如果我需要结果号n+1呢?只要问n+m,其中m是某种常量值。我想你在这里担心的内存太多了;TopDocs只包含分数和id,这几乎没有内存,即使是大n。如果你不相信我,请运行一个分析程序来找出答案。我认为点击的“问题”更多的是它没有在后台运行额外的查询。如果有,也许它不会表现得那么差。你能在这里粘贴解决方案的相关部分,而不仅仅是一个链接吗?谢谢
int freq = searcher.docFreq(new Term(FIELD, value));
TopDocs hits = indexSearcher.search(query, freq);
for (int i=0 ; i<hits.totalHits ; i++) {
   // Process hit
}
TopDocs tp = ms.search(query, 1); 

TopDocs hits = indexSearcher.search(query, tp.totalHits);
for (int i=0 ; i<hits.totalHits ; i++) {
   // Process hit
}