jcseg代码无法运行测试代码

jujusharp 发布于 2014/11/04 12:50
阅读 828
收藏 0

@狮子的魂 你好,想跟你请教个问题:

我按照如下代码测试查询, 系统抛出异常, 想请教下原因:

@Test
    public void testSearch2() throws Exception {
        Analyzer analyzer = new JcsegAnalyzer4X(JcsegTaskConfig.SIMPLE_MODE);
        RAMDirectory directory = new RAMDirectory();

        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_9,
                analyzer);
        try (IndexWriter writer = new IndexWriter(directory, config)) {
            Document doc = new Document();
            doc.add(new TextField("name", "钢铁是怎样炼成的", Field.Store.YES));
            writer.addDocument(doc);
        }

        // 3. search
        try (IndexReader reader = DirectoryReader.open(directory)) {
            QueryParser queryParser = new QueryParser(Version.LUCENE_4_9, "name", analyzer);
            Query query = queryParser.parse("钢铁");
            IndexSearcher searcher = new IndexSearcher(reader);
            TopScoreDocCollector collector = TopScoreDocCollector.create(10, true);
            searcher.search(query, collector);
            ScoreDoc[] hits = collector.topDocs().scoreDocs;

            // 4. display results
            for (ScoreDoc scoreDoc : hits) {
                int docId = scoreDoc.doc;
                Document d = searcher.doc(docId);
                logger.info(d.get("name"));
            }
        }
    }

异常信息:

java.lang.AssertionError: TokenStream implementation classes or at least their incrementToken() implementation must be final
    at org.apache.lucene.analysis.TokenStream.assertFinal(TokenStream.java:126)
    at org.apache.lucene.analysis.TokenStream.<init>(TokenStream.java:99)
    at org.apache.lucene.analysis.Tokenizer.<init>(Tokenizer.java:42)
    at org.lionsoul.jcseg.analyzer.JcsegTokenizer.<init>(Unknown Source)
    at org.lionsoul.jcseg.analyzer.JcsegAnalyzer4X.createComponents(Unknown Source)

上述代码在StandardAnalyzer下是正常的

jcseg版本1.9.5, lucene版本4.9.0

加载中
0
狮子的魂
狮子的魂

恩,错误明显的说明了是Jcseg引发的断言错误。

说明lucene的API变化了,要求TokenStream的实现类或者他的incrementToken()方法是final的。

你可以更改下org.lionsoul.jcseg.jcsegTokenizer的increaseToken为final的,然后重新编译下再试试。

0
jujusharp
jujusharp
感谢你的回复, 我自行编译测试下. 我以为已经支持4.9了
0
狮子的魂
狮子的魂

引用来自“jujusharp”的评论

感谢你的回复, 我自行编译测试下. 我以为已经支持4.9了
这也是我很好奇的,我使用基于lucene-4.9.0的elasticsearch没有问题。 这个问题还需要带查证。。。
0
jujusharp
jujusharp

引用来自“狮子的魂”的评论

恩,错误明显的说明了是Jcseg引发的断言错误。

说明lucene的API变化了,要求TokenStream的实现类或者他的incrementToken()方法是final的。

你可以更改下org.lionsoul.jcseg.jcsegTokenizer的increaseToken为final的,然后重新编译下再试试。

按照你的建议修改以下两个文件相应方法为final后可以正常运行:

org.lionsoul.jcseg.analyzer.JcsegTokenizer.incrementToken;

org.lionsoul.jcseg.analyzer.JcsegFilter.incrementToken;

不知道这个是不是因为新版本的原因引起.


0
狮子的魂
狮子的魂

引用来自“狮子的魂”的评论

恩,错误明显的说明了是Jcseg引发的断言错误。

说明lucene的API变化了,要求TokenStream的实现类或者他的incrementToken()方法是final的。

你可以更改下org.lionsoul.jcseg.jcsegTokenizer的increaseToken为final的,然后重新编译下再试试。

引用来自“jujusharp”的评论

按照你的建议修改以下两个文件相应方法为final后可以正常运行:

org.lionsoul.jcseg.analyzer.JcsegTokenizer.incrementToken;

org.lionsoul.jcseg.analyzer.JcsegFilter.incrementToken;

不知道这个是不是因为新版本的原因引起.


我也不知道,我审查后会发布新的提交,感谢你的反馈。
返回顶部
顶部