问题: 使用lucene3.5 建立索引的时候,分别使用批量提交和逐条提交的方式建立索引。
在使用短语查询的时候,却发生巨大变化。批量提交的索引,无法实现短语查询。
1.逐条提交的索引代码片段:
public static void createIndex() throws Exception{
IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_35, new PaodingAnalyzer());
Directory directory = FSDirectory.open(new File("c:/index"));
IndexWriter writer = new IndexWriter(directory, conf);
String str = "文化人;文化人谈文化";
String[] values = str.split(";");
for (String value : values)
{
Document doc = new Document();
Field field = new Field("test", value, Store.YES, Index.ANALYZED_NO_NORMS, TermVector.WITH_POSITIONS_OFFSETS);
field.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS);
doc.add(field);
writer.addDocument(doc);
writer.commit();
}
writer.close();
}
2.批量添加的代码片段:
public static void createIndex() throws Exception{
IndexWriterConfig conf = new IndexWriterConfig(Version.LUCENE_35, new PaodingAnalyzer());
Directory directory = FSDirectory.open(new File("c:/index"));
IndexWriter writer = new IndexWriter(directory, conf);
String str = "文化人;文化人谈文化";
String[] values = str.split(";");
List docs = new ArrayList();
for (String value : values)
{
Document doc = new Document();
Field field = new Field("test", value, Store.YES, Index.ANALYZED_NO_NORMS, TermVector.WITH_POSITIONS_OFFSETS);
field.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS);
doc.add(field);
docs.add(doc);
}
writer.addDocuments(docs);
writer.commit();
writer.close();
}
3.检索代码片段
public static void testSearch() throws Exception
{
String rules = "\"文化人谈文化\"~2";
IndexReader reader = IndexReader.open(FSDirectory.open(new File(
"c:/index")));
IndexSearcher searcher = new IndexSearcher(reader);
QueryParser parser = new QueryParser(Version.LUCENE_35, "test",
new PaodingAnalyzer());
Query query = parser.parse(rules);
System.out.println(query.toString());
TopDocs topDocs = searcher.search(query, 10);
ScoreDoc[] docs = topDocs.scoreDocs;
System.out.println(docs.length);
for (ScoreDoc scoreDoc : docs)
{
Document doc = searcher.doc(scoreDoc.doc);
System.out.println(doc);
}
}
检索结果,使用逐条提交的方式可以检索到结果,使用批量提交的方式无法检索到结果。使用luke工具,分别查看了两种提交方式下的索引,发现其偏移量,position,词频,等待信息都是一样的。换用IK 分词器,也是一样的效果。
但是,如果将查询条件中的slop值,设为0, 则两种方式提交的索引,都能命中。。理论上slop 的值越大,命中的就会越多,不解为何设为0都能命中,加大后反而没命中。
希望有使用过lucene的朋友帮帮忙!
|
|