当前位置: 首页 > 知识库问答 >
问题:

Lucene从3.5升级到4.10-如何处理Java API更改

暨宸
2023-03-14

我目前正在将一个搜索引擎应用程序从Lucene 3.5.0升级到4.10.3版本。版本4中有一些实质性的API更改破坏了向后兼容性。我已经设法解决了其中的大部分问题,但仍有几个问题需要一些帮助:

    null
@Override
public TokenStream tokenStream(String fieldName, Reader reader) {
    CharStream charStream = CharReader.get(reader);        
    return
        new LowerCaseFilter(version,
            new SeparationFilter(version,
                new WhitespaceTokenizer(version,
                    new HTMLStripFilter(charStream))));
}

上面引用的方法还有一个问题:

这里似乎也发生了一些相当大的变化。

这门课在Lucene4中已经消失了。有什么简单的解决办法吗?从更改日志中:

TermPositionVector termVector = (TermPositionVector) reader.getTermFreqVector(...);

共有1个答案

江睿
2023-03-14

我在Lucene邮件列表中找到了核心开发人员Uwe Schindler对您问题的回应。我花了一些时间来考虑新的API,所以我需要在忘记之前写下一些东西。

这些注意事项适用于Lucene 4.10.3。

new Analyzer() {
    @Override
    protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
        Tokenizer source = new WhitespaceTokenizer(new HTMLStripCharFilter(reader));
        TokenStream sink = new LowerCaseFilter(source);
        return new TokenStreamComponents(source, sink);
    }
};
  1. TokenStreamComponents的构造函数接受源和接收器。接收器是标记流的最终结果,由analyzer.tokenstream()返回,因此将其设置为筛选器链。源是应用任何筛选器之前的令牌流。
  2. HtmlStripCharfilter,尽管它的名字是,实际上是java.io.Reader的一个子类,它删除了HTML构造,所以您不再需要CharReader.
Document doc = new Document();
FieldType f = new FieldType();
f.setIndexed(true);
f.setStoreTermVectors(true);
f.setStoreTermVectorPositions(true);
doc.add(new Field("text", "hello", f));

最后,为了获得文档字段的频率和位置信息,您可以像下面这样深入研究新API(根据下面的答案改编):

// IndexReader ir;
// int docID = 0;
Terms terms = ir.getTermVector(docID, "text");
terms.hasPositions(); // should be true if you set the field to store positions
TermsEnum termsEnum = terms.iterator(null);
BytesRef term = null;
// Explore the terms for this field
while ((term = termsEnum.next()) != null) {
    // Enumerate through documents, in this case only one
    DocsAndPositionsEnum docsEnum = termsEnum.docsAndPositions(null, null);
    int docIdEnum;
    while ((docIdEnum = docsEnum.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
        for (int i = 0; i < docsEnum.freq(); i++) {
            System.out.println(term.utf8ToString() + " " + docIdEnum + " "
                    + docsEnum.nextPosition());
        }
    }
}

如果terms.iterator()返回一个实际的迭代函数就好了。

 类似资料:
  • 根据Hazelcast官方文档,从版本3.8开始支持滚动升级。 如果我的服务器版本是3.5,是否有办法创建一个成功的集群,其中新的盒子运行较新版本的Hazelcast? 天真地升级到3.6。*导致了两个不同的集群(旧的盒子仍然运行3.5,而另一个新的盒子运行3.6,显然没有数据,因为它永远无法与现有的盒子接触)。 我的部署过程如下: 创建一组新框 我的想法是在磁盘/数据库上存储快照,并在推出时从数

  • Symfony 2.7于2015年4月30日发布,是继2.3版本之后的当前LTS(长期支持)版本。Symfony 2.3的这些版本的维护将于2016年5月结束,Symfony 2.7的维护将于2018年5月结束。两个版本的安全补丁将在维护结束后的一年内发布。 正如Massimiliano Arione在公告评论中所建议的那样,从Symfony 2.3升级到2.7需要做哪些更改,而无需检查所有次要升

  • 升级准备工作: pika在2.3.3版本时为了确保同步的可靠性,增加了server-id验证功能,因此pika2.3.3~pika2.3.6与pika2.3.3之前的版本无法互相同步 如果你的pika版本<2.3.3, 你需要准备pika2.3.6及pika3.0.16的bin文件,这里需要注意的是3.0.x需要准备3.0.16以后的版本(或者3.0.6版本),其他版本pika不再能与低版本(2.

  • 为了帮助大伙儿升级,我们为现在的Apache用户提供了一份重要信息的文档说明。这些只是一些简要说明,你可以从新特性文档或src/CHANGES文件中得到更多信息。 这篇文档仅仅描述了从版本 2.0 到 2.2 的变化,如果你是从1.3版进行升级的,请查考从1.3升级到2.0文档。 编译时配置的改变 编译过程与2.0版本非常相似,你曾经使用过的configure命令行(在安装目录下的build/co

  • 为了帮助大伙儿升级,我们为现在的Apache用户提供了一份重要信息的文档说明。这些只是一些简要说明,你可以从新特性文档或src/CHANGES文件中得到更多信息。 编译时配置的改变 Apache现在使用autoconf和libtool系统来进行安装进程的配置。这个系统用起来很像Apache1.3的APACI系统,但并不相同。 在普通的选择编译模块的基础上,Apache2.0把请求进程的主要部分移到

  • WARNING 本升级指南仅适用于 2.2 版本升级至 2.3 版本,如果你并非 2.2 版本,请查看其他升级指南,Plus 程序不允许跨版本升级! 更新代码 预计耗时: 2 小时 这是你自我操作的步骤,确认将你的 2.2 版本代码升级到 2.3 版本,如果你做过一些自定义修改可能会出现代码冲突,你需要解决。 升级依赖 预计耗时: 3 分钟 进入 Plus 程序目录,执行: composer up

  • WARNING 本升级指南仅适用于 2.1 版本升级至 2.2 版本,如果你并非 2.1 版本,请查看其他升级指南,Plus 程序不允许跨版本升级! 更新代码 预计耗时: 1 小时 这是你自我操作的步骤,确认将你的 2.1 版本代码升级到 2.2 版本,如果你做过一些自定义修改可能会出现代码冲突,你需要解决。 升级依赖 预计耗时: 3 分钟 进入 Plus 程序目录,执行: composer up