Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Lucene: Java-User

A bug in multisearcher?

 

 

Lucene java-user RSS feed   Index | Next | Previous | View Threaded


hyan2008 at gmail

May 13, 2011, 1:56 PM

Post #1 of 4 (388 views)
Permalink
A bug in multisearcher?

hi, guys

Xiaoyang and I today just found a bug of lucene.
This is actually a Multi-searcher bug. In particular,

If we search with Not on NumericRange and we use MultiSearcher, we
will wrong search results (However, if we use IndexSearcher, the
result is correct). Basically the NotOfNumericRange does not have
impact on multisearcher. We suspect it is because the createWeight()
function in MultiSearcher and hope some of you guys can help us
confirm or fix this bug of
lucene. I attached the code to reproduce this case. Please check it
out.

In the attached code, I have two separate functions :

(1) testNumericRangeSingleSearcher(Query query)
where I create 6 documents, with a field called "id"= 1,2,3,4,5,6
respectively . Then I search by the query which is
+MatchAllDocs -NumericRange(3,3). The expected result then should
be 5 hits since the document 3 is MUST_NOT.

(2) testNumericRangeMultiSearcher(Query query)
where i create 2 RamDirectory(), each of which has 3 documents,
1,2,3; and 4,5,6. Then I search by the same query as above using
multiSearcher. The expected result should also be 5 hits.

However, from (1), we get 5 hits = expected results, while in (2) we
get 6 hits != expected results.


Thank you very much!


Code: (based on lucene 3.0.x)



import java.io.IOException;
import java.io.PrintStream;
import java.text.DecimalFormat;

import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumericField;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.FieldCache;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.MultiSearcher;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Searchable;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.RAMDirectory;

import com.convertlucene.ConvertFrom2To3;

public class TestNumericRange
{
public final static void main(String[] args)
{
try
{
BooleanQuery query = new BooleanQuery();
query.add(NumericRangeQuery.newIntRange("numId", 3, 3, true,
true), Occur.MUST_NOT);
query.add(new MatchAllDocsQuery(), Occur.MUST);

testNumericRangeSingleSearcher(query);
testNumericRangeMultiSearcher(query);

}
catch(Exception e)
{
e.printStackTrace();
}
}



public static void testNumericRangeSingleSearcher(Query query)
throws CorruptIndexException, LockObtainFailedException, IOException
{
String[] ids = {"1", "2", "3", "4", "5", "6"};

Directory directory = new RAMDirectory();

IndexWriter writer = new IndexWriter(directory, new
WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);

for (int i = 0; i < ids.length; i++)
{
Document doc = new Document();
doc.add(new Field("id", ids[i],
Field.Store.YES,
Field.Index.NOT_ANALYZED));
doc.add(new NumericField("numId").setIntValue(Integer.valueOf(ids[i])));
writer.addDocument(doc);
}
writer.close();


IndexSearcher searcher = new IndexSearcher(directory);

TopDocs docs = searcher.search(query, 10);
System.out.println("SingleSearcher: testNumericRange: hitNum: " +
docs.totalHits);
for(ScoreDoc doc : docs.scoreDocs)
{
System.out.println(searcher.explain(query, doc.doc));
}
searcher.close();

directory.close();
}

public static void testNumericRangeMultiSearcher(Query query) throws
CorruptIndexException, LockObtainFailedException, IOException
{
String[] ids1 = {"1", "2", "3"};
Directory directory1 = new RAMDirectory();
IndexWriter writer1 = new IndexWriter(directory1, new
WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);
for (int i = 0; i < ids1.length; i++)
{
Document doc = new Document();
doc.add(new Field("id", ids1[i],
Field.Store.YES,
Field.Index.NOT_ANALYZED));
doc.add(new NumericField("numId").setIntValue(Integer.valueOf(ids1[i])));
writer1.addDocument(doc);
}
writer1.close();

String[] ids2 = {"4", "5", "6"};
Directory directory2 = new RAMDirectory();
IndexWriter writer2 = new IndexWriter(directory2, new
WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);
for (int i = 0; i < ids2.length; i++)
{
Document doc = new Document();
doc.add(new Field("id", ids2[i],
Field.Store.YES,
Field.Index.NOT_ANALYZED));
doc.add(new NumericField("numId").setIntValue(Integer.valueOf(ids2[i])));
writer2.addDocument(doc);
}
writer2.close();

IndexSearcher[] searchers = new IndexSearcher[2];
searchers[0] = new IndexSearcher(directory1);
searchers[1] = new IndexSearcher(directory2);
MultiSearcher multiSearcher = new MultiSearcher(searchers);
TopDocs docs = multiSearcher.search(query, 10);
System.out.println("MultiSearcher: testNumericRange: hitNum: " +
docs.totalHits);
for(ScoreDoc doc : docs.scoreDocs)
{
System.out.println(multiSearcher.explain(query, doc.doc));
}
multiSearcher.close();

directory1.close();
directory2.close();
}


}

---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe [at] lucene
For additional commands, e-mail: java-user-help [at] lucene


uwe at thetaphi

May 13, 2011, 2:34 PM

Post #2 of 4 (377 views)
Permalink
RE: A bug in multisearcher? [In reply to]

Hi,

This is a well-known bug, which is unfixable (query rewrite across different
searchers is wrong). In general you should use a MultiReader on your
IndexReaders and use a simple IndexSearcher on top of that MultiReader.
MultiSearcher and ParallelMultiSearcher were deprecated in 3.1 because of
this and disappear in coming Lucene 4.0. ParallelMultiSearcher is included
in IndexSearcher in 3.1 (it parallelizes across index segments).

For more information, see: https://issues.apache.org/jira/browse/LUCENE-2756

Uwe

-----
Uwe Schindler
H.-H.-Meier-Allee 63, D-28213 Bremen
http://www.thetaphi.de
eMail: uwe [at] thetaphi


> -----Original Message-----
> From: hao yan [mailto:hyan2008 [at] gmail]
> Sent: Friday, May 13, 2011 10:56 PM
> To: java-user [at] lucene
> Cc: Xiaoyang Gu; hao yan
> Subject: A bug in multisearcher?
>
> hi, guys
>
> Xiaoyang and I today just found a bug of lucene.
> This is actually a Multi-searcher bug. In particular,
>
> If we search with Not on NumericRange and we use MultiSearcher, we will
> wrong search results (However, if we use IndexSearcher, the result is
> correct). Basically the NotOfNumericRange does not have impact on
> multisearcher. We suspect it is because the createWeight() function in
> MultiSearcher and hope some of you guys can help us confirm or fix this
bug
> of lucene. I attached the code to reproduce this case. Please check it
out.
>
> In the attached code, I have two separate functions :
>
> (1) testNumericRangeSingleSearcher(Query query)
> where I create 6 documents, with a field called "id"= 1,2,3,4,5,6
> respectively . Then I search by the query which is
> +MatchAllDocs -NumericRange(3,3). The expected result then should be 5
> hits since the document 3 is MUST_NOT.
>
> (2) testNumericRangeMultiSearcher(Query query)
> where i create 2 RamDirectory(), each of which has 3 documents, 1,2,3;
and
> 4,5,6. Then I search by the same query as above using multiSearcher. The
> expected result should also be 5 hits.
>
> However, from (1), we get 5 hits = expected results, while in (2) we get 6
hits
> != expected results.
>
>
> Thank you very much!
>
>
> Code: (based on lucene 3.0.x)
>
>
>
> import java.io.IOException;
> import java.io.PrintStream;
> import java.text.DecimalFormat;
>
> import org.apache.lucene.analysis.WhitespaceAnalyzer;
> import org.apache.lucene.document.Document;
> import org.apache.lucene.document.Field; import
> org.apache.lucene.document.NumericField;
> import org.apache.lucene.index.CorruptIndexException;
> import org.apache.lucene.index.IndexWriter;
> import org.apache.lucene.index.Term;
> import org.apache.lucene.search.BooleanQuery;
> import org.apache.lucene.search.FieldCache;
> import org.apache.lucene.search.IndexSearcher;
> import org.apache.lucene.search.MatchAllDocsQuery;
> import org.apache.lucene.search.MultiSearcher;
> import org.apache.lucene.search.NumericRangeQuery;
> import org.apache.lucene.search.Query;
> import org.apache.lucene.search.ScoreDoc;
> import org.apache.lucene.search.Searchable;
> import org.apache.lucene.search.Sort;
> import org.apache.lucene.search.SortField;
> import org.apache.lucene.search.TermQuery;
> import org.apache.lucene.search.TopDocs; import
> org.apache.lucene.search.BooleanClause.Occur;
> import org.apache.lucene.store.Directory;
> import org.apache.lucene.store.LockObtainFailedException;
> import org.apache.lucene.store.RAMDirectory;
>
> import com.convertlucene.ConvertFrom2To3;
>
> public class TestNumericRange
> {
> public final static void main(String[] args) {
> try
> {
> BooleanQuery query = new BooleanQuery();
> query.add(NumericRangeQuery.newIntRange("numId", 3, 3, true, true),
> Occur.MUST_NOT);
> query.add(new MatchAllDocsQuery(), Occur.MUST);
>
> testNumericRangeSingleSearcher(query);
> testNumericRangeMultiSearcher(query);
>
> }
> catch(Exception e)
> {
> e.printStackTrace();
> }
> }
>
>
>
> public static void testNumericRangeSingleSearcher(Query query) throws
> CorruptIndexException, LockObtainFailedException, IOException {
> String[] ids = {"1", "2", "3", "4", "5", "6"};
>
> Directory directory = new RAMDirectory();
>
> IndexWriter writer = new IndexWriter(directory, new
> WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);
>
> for (int i = 0; i < ids.length; i++)
> {
> Document doc = new Document();
> doc.add(new Field("id", ids[i],
> Field.Store.YES,
> Field.Index.NOT_ANALYZED));
> doc.add(new
> NumericField("numId").setIntValue(Integer.valueOf(ids[i])));
> writer.addDocument(doc);
> }
> writer.close();
>
>
> IndexSearcher searcher = new IndexSearcher(directory);
>
> TopDocs docs = searcher.search(query, 10);
> System.out.println("SingleSearcher: testNumericRange: hitNum: " +
> docs.totalHits);
> for(ScoreDoc doc : docs.scoreDocs)
> {
> System.out.println(searcher.explain(query, doc.doc));
> }
> searcher.close();
>
> directory.close();
> }
>
> public static void testNumericRangeMultiSearcher(Query query) throws
> CorruptIndexException, LockObtainFailedException, IOException {
> String[] ids1 = {"1", "2", "3"};
> Directory directory1 = new RAMDirectory();
> IndexWriter writer1 = new IndexWriter(directory1, new
> WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);
> for (int i = 0; i < ids1.length; i++)
> {
> Document doc = new Document();
> doc.add(new Field("id", ids1[i],
> Field.Store.YES,
> Field.Index.NOT_ANALYZED));
> doc.add(new
> NumericField("numId").setIntValue(Integer.valueOf(ids1[i])));
> writer1.addDocument(doc);
> }
> writer1.close();
>
> String[] ids2 = {"4", "5", "6"};
> Directory directory2 = new RAMDirectory();
> IndexWriter writer2 = new IndexWriter(directory2, new
> WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);
> for (int i = 0; i < ids2.length; i++)
> {
> Document doc = new Document();
> doc.add(new Field("id", ids2[i],
> Field.Store.YES,
> Field.Index.NOT_ANALYZED));
> doc.add(new
> NumericField("numId").setIntValue(Integer.valueOf(ids2[i])));
> writer2.addDocument(doc);
> }
> writer2.close();
>
> IndexSearcher[] searchers = new IndexSearcher[2];
> searchers[0] = new IndexSearcher(directory1);
> searchers[1] = new IndexSearcher(directory2);
> MultiSearcher multiSearcher = new MultiSearcher(searchers);
> TopDocs docs = multiSearcher.search(query, 10);
> System.out.println("MultiSearcher: testNumericRange: hitNum: " +
> docs.totalHits);
> for(ScoreDoc doc : docs.scoreDocs)
> {
> System.out.println(multiSearcher.explain(query, doc.doc));
> }
> multiSearcher.close();
>
> directory1.close();
> directory2.close();
> }
>
>
> }
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-user-unsubscribe [at] lucene
> For additional commands, e-mail: java-user-help [at] lucene



---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe [at] lucene
For additional commands, e-mail: java-user-help [at] lucene


haichengyl at sina

May 13, 2011, 8:26 PM

Post #3 of 4 (368 views)
Permalink
Re: A bug in multisearcher? [In reply to]

2011-05-14



haichengyl



发件人: hao yan
发送时间: 2011-05-14 04:56:27
收件人: java-user
抄送: Xiaoyang Gu; hao yan
主题: A bug in multisearcher?

hi, guys
Xiaoyang and I today just found a bug of lucene.
This is actually a Multi-searcher bug. In particular,
If we search with Not on NumericRange and we use MultiSearcher, we
will wrong search results (However, if we use IndexSearcher, the
result is correct). Basically the NotOfNumericRange does not have
impact on multisearcher. We suspect it is because the createWeight()
function in MultiSearcher and hope some of you guys can help us
confirm or fix this bug of
lucene. I attached the code to reproduce this case. Please check it
out.
In the attached code, I have two separate functions :
(1) testNumericRangeSingleSearcher(Query query)
where I create 6 documents, with a field called "id"= 1,2,3,4,5,6
respectively . Then I search by the query which is
+MatchAllDocs -NumericRange(3,3). The expected result then should
be 5 hits since the document 3 is MUST_NOT.
(2) testNumericRangeMultiSearcher(Query query)
where i create 2 RamDirectory(), each of which has 3 documents,
1,2,3; and 4,5,6. Then I search by the same query as above using
multiSearcher. The expected result should also be 5 hits.
However, from (1), we get 5 hits = expected results, while in (2) we
get 6 hits != expected results.
Thank you very much!
Code: (based on lucene 3.0.x)
import java.io.IOException;
import java.io.PrintStream;
import java.text.DecimalFormat;
import org.apache.lucene.analysis.WhitespaceAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.NumericField;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.FieldCache;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.MultiSearcher;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Searchable;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.SortField;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.RAMDirectory;
import com.convertlucene.ConvertFrom2To3;
public class TestNumericRange
{
public final static void main(String[] args)
{
try
{
BooleanQuery query = new BooleanQuery();
query.add(NumericRangeQuery.newIntRange("numId", 3, 3, true,
true), Occur.MUST_NOT);
query.add(new MatchAllDocsQuery(), Occur.MUST);
testNumericRangeSingleSearcher(query);
testNumericRangeMultiSearcher(query);
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void testNumericRangeSingleSearcher(Query query)
throws CorruptIndexException, LockObtainFailedException, IOException
{
String[] ids = {"1", "2", "3", "4", "5", "6"};
Directory directory = new RAMDirectory();
IndexWriter writer = new IndexWriter(directory, new
WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);
for (int i = 0; i < ids.length; i++)
{
Document doc = new Document();
doc.add(new Field("id", ids[i],
Field.Store.YES,
Field.Index.NOT_ANALYZED));
doc.add(new NumericField("numId").setIntValue(Integer.valueOf(ids[i])));
writer.addDocument(doc);
}
writer.close();
IndexSearcher searcher = new IndexSearcher(directory);
TopDocs docs = searcher.search(query, 10);
System.out.println("SingleSearcher: testNumericRange: hitNum: " +
docs.totalHits);
for(ScoreDoc doc : docs.scoreDocs)
{
System.out.println(searcher.explain(query, doc.doc));
}
searcher.close();
directory.close();
}
public static void testNumericRangeMultiSearcher(Query query) throws
CorruptIndexException, LockObtainFailedException, IOException
{
String[] ids1 = {"1", "2", "3"};
Directory directory1 = new RAMDirectory();
IndexWriter writer1 = new IndexWriter(directory1, new
WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);
for (int i = 0; i < ids1.length; i++)
{
Document doc = new Document();
doc.add(new Field("id", ids1[i],
Field.Store.YES,
Field.Index.NOT_ANALYZED));
doc.add(new NumericField("numId").setIntValue(Integer.valueOf(ids1[i])));
writer1.addDocument(doc);
}
writer1.close();
String[] ids2 = {"4", "5", "6"};
Directory directory2 = new RAMDirectory();
IndexWriter writer2 = new IndexWriter(directory2, new
WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);
for (int i = 0; i < ids2.length; i++)
{
Document doc = new Document();
doc.add(new Field("id", ids2[i],
Field.Store.YES,
Field.Index.NOT_ANALYZED));
doc.add(new NumericField("numId").setIntValue(Integer.valueOf(ids2[i])));
writer2.addDocument(doc);
}
writer2.close();
IndexSearcher[] searchers = new IndexSearcher[2];
searchers[0] = new IndexSearcher(directory1);
searchers[1] = new IndexSearcher(directory2);
MultiSearcher multiSearcher = new MultiSearcher(searchers);
TopDocs docs = multiSearcher.search(query, 10);
System.out.println("MultiSearcher: testNumericRange: hitNum: " +
docs.totalHits);
for(ScoreDoc doc : docs.scoreDocs)
{
System.out.println(multiSearcher.explain(query, doc.doc));
}
multiSearcher.close();
directory1.close();
directory2.close();
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe [at] lucene
For additional commands, e-mail: java-user-help [at] lucene


uwe at thetaphi

May 14, 2011, 4:43 AM

Post #4 of 4 (374 views)
Permalink
RE: A bug in multisearcher? [In reply to]

Hi,

Your boss seem to have opened also an issue in the bug tracker:
https://issues.apache.org/jira/browse/LUCENE-3096

The solution and explanation why this is won't fix is also given there.

Uwe

-----
Uwe Schindler
H.-H.-Meier-Allee 63, D-28213 Bremen
http://www.thetaphi.de
eMail: uwe [at] thetaphi

> -----Original Message-----
> From: hao yan [mailto:hyan2008 [at] gmail]
> Sent: Friday, May 13, 2011 10:56 PM
> To: java-user [at] lucene
> Cc: Xiaoyang Gu; hao yan
> Subject: A bug in multisearcher?
>
> hi, guys
>
> Xiaoyang and I today just found a bug of lucene.
> This is actually a Multi-searcher bug. In particular,
>
> If we search with Not on NumericRange and we use MultiSearcher, we will
> wrong search results (However, if we use IndexSearcher, the result is
> correct). Basically the NotOfNumericRange does not have impact on
> multisearcher. We suspect it is because the createWeight() function in
> MultiSearcher and hope some of you guys can help us confirm or fix this
bug
> of lucene. I attached the code to reproduce this case. Please check it
out.
>
> In the attached code, I have two separate functions :
>
> (1) testNumericRangeSingleSearcher(Query query)
> where I create 6 documents, with a field called "id"= 1,2,3,4,5,6
> respectively . Then I search by the query which is
> +MatchAllDocs -NumericRange(3,3). The expected result then should be 5
> hits since the document 3 is MUST_NOT.
>
> (2) testNumericRangeMultiSearcher(Query query)
> where i create 2 RamDirectory(), each of which has 3 documents, 1,2,3;
and
> 4,5,6. Then I search by the same query as above using multiSearcher. The
> expected result should also be 5 hits.
>
> However, from (1), we get 5 hits = expected results, while in (2) we get 6
hits
> != expected results.
>
>
> Thank you very much!
>
>
> Code: (based on lucene 3.0.x)
>
>
>
> import java.io.IOException;
> import java.io.PrintStream;
> import java.text.DecimalFormat;
>
> import org.apache.lucene.analysis.WhitespaceAnalyzer;
> import org.apache.lucene.document.Document;
> import org.apache.lucene.document.Field; import
> org.apache.lucene.document.NumericField;
> import org.apache.lucene.index.CorruptIndexException;
> import org.apache.lucene.index.IndexWriter;
> import org.apache.lucene.index.Term;
> import org.apache.lucene.search.BooleanQuery;
> import org.apache.lucene.search.FieldCache;
> import org.apache.lucene.search.IndexSearcher;
> import org.apache.lucene.search.MatchAllDocsQuery;
> import org.apache.lucene.search.MultiSearcher;
> import org.apache.lucene.search.NumericRangeQuery;
> import org.apache.lucene.search.Query;
> import org.apache.lucene.search.ScoreDoc;
> import org.apache.lucene.search.Searchable;
> import org.apache.lucene.search.Sort;
> import org.apache.lucene.search.SortField;
> import org.apache.lucene.search.TermQuery;
> import org.apache.lucene.search.TopDocs; import
> org.apache.lucene.search.BooleanClause.Occur;
> import org.apache.lucene.store.Directory;
> import org.apache.lucene.store.LockObtainFailedException;
> import org.apache.lucene.store.RAMDirectory;
>
> import com.convertlucene.ConvertFrom2To3;
>
> public class TestNumericRange
> {
> public final static void main(String[] args) {
> try
> {
> BooleanQuery query = new BooleanQuery();
> query.add(NumericRangeQuery.newIntRange("numId", 3, 3, true, true),
> Occur.MUST_NOT);
> query.add(new MatchAllDocsQuery(), Occur.MUST);
>
> testNumericRangeSingleSearcher(query);
> testNumericRangeMultiSearcher(query);
>
> }
> catch(Exception e)
> {
> e.printStackTrace();
> }
> }
>
>
>
> public static void testNumericRangeSingleSearcher(Query query) throws
> CorruptIndexException, LockObtainFailedException, IOException {
> String[] ids = {"1", "2", "3", "4", "5", "6"};
>
> Directory directory = new RAMDirectory();
>
> IndexWriter writer = new IndexWriter(directory, new
> WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);
>
> for (int i = 0; i < ids.length; i++)
> {
> Document doc = new Document();
> doc.add(new Field("id", ids[i],
> Field.Store.YES,
> Field.Index.NOT_ANALYZED));
> doc.add(new
> NumericField("numId").setIntValue(Integer.valueOf(ids[i])));
> writer.addDocument(doc);
> }
> writer.close();
>
>
> IndexSearcher searcher = new IndexSearcher(directory);
>
> TopDocs docs = searcher.search(query, 10);
> System.out.println("SingleSearcher: testNumericRange: hitNum: " +
> docs.totalHits);
> for(ScoreDoc doc : docs.scoreDocs)
> {
> System.out.println(searcher.explain(query, doc.doc));
> }
> searcher.close();
>
> directory.close();
> }
>
> public static void testNumericRangeMultiSearcher(Query query) throws
> CorruptIndexException, LockObtainFailedException, IOException {
> String[] ids1 = {"1", "2", "3"};
> Directory directory1 = new RAMDirectory();
> IndexWriter writer1 = new IndexWriter(directory1, new
> WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);
> for (int i = 0; i < ids1.length; i++)
> {
> Document doc = new Document();
> doc.add(new Field("id", ids1[i],
> Field.Store.YES,
> Field.Index.NOT_ANALYZED));
> doc.add(new
> NumericField("numId").setIntValue(Integer.valueOf(ids1[i])));
> writer1.addDocument(doc);
> }
> writer1.close();
>
> String[] ids2 = {"4", "5", "6"};
> Directory directory2 = new RAMDirectory();
> IndexWriter writer2 = new IndexWriter(directory2, new
> WhitespaceAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED);
> for (int i = 0; i < ids2.length; i++)
> {
> Document doc = new Document();
> doc.add(new Field("id", ids2[i],
> Field.Store.YES,
> Field.Index.NOT_ANALYZED));
> doc.add(new
> NumericField("numId").setIntValue(Integer.valueOf(ids2[i])));
> writer2.addDocument(doc);
> }
> writer2.close();
>
> IndexSearcher[] searchers = new IndexSearcher[2];
> searchers[0] = new IndexSearcher(directory1);
> searchers[1] = new IndexSearcher(directory2);
> MultiSearcher multiSearcher = new MultiSearcher(searchers);
> TopDocs docs = multiSearcher.search(query, 10);
> System.out.println("MultiSearcher: testNumericRange: hitNum: " +
> docs.totalHits);
> for(ScoreDoc doc : docs.scoreDocs)
> {
> System.out.println(multiSearcher.explain(query, doc.doc));
> }
> multiSearcher.close();
>
> directory1.close();
> directory2.close();
> }
>
>
> }
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: java-user-unsubscribe [at] lucene
> For additional commands, e-mail: java-user-help [at] lucene



---------------------------------------------------------------------
To unsubscribe, e-mail: java-user-unsubscribe [at] lucene
For additional commands, e-mail: java-user-help [at] lucene

Lucene java-user RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.