分享

lucene 3.5 批量提交之后导致无法实现跨度查询!!求高人

xu101q 发表于 2013-10-16 13:41:12 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 5146
问题: 使用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的朋友帮帮忙!
              
               
               

已有(3)人评论

跳转到指定楼层
kky2010_110 发表于 2013-10-16 13:41:58

            Field field = new Field("test", 这里为什么只有一个field 一个test,你问什么要for循环呢
这不是说field只有最后一个吗?
        
回复

使用道具 举报

kky2010_110 发表于 2013-10-16 13:42:50

            参考:
doc.add(new Field("content", content.toString(),
                                                Field.Store.YES, Field.Index.ANALYZED));
oc.add(new Field("fileName", textFiles[i].getName(),
                                                Field.Store.YES, Field.Index.ANALYZED));
        
回复

使用道具 举报

xu101q 发表于 2013-10-16 13:43:44

            引用 1 楼  的回复:Field field = new Field("test", 这里为什么只有一个field 一个test,你问什么要for循环呢
这不是说field只有最后一个吗?

什么意思哦,我的循环,构造了2个document。 第一种,是将document放入一个list一起提交, 第二种,每建立好一个document就提交。
主要是 第一种情况下, 使用我上面的短语查询,无法查到结果
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条