gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:01:56 25 4
gpt4 key购买 nike

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

  1. “无法覆盖 Analyzer 的 final方法”

原始代码扩展了 Analyzer 类并覆盖了 tokenStream(...)。

@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))));
}

但是这个方法现在是最终的,我不确定如何理解更改日志中的以下注释:

ReusableAnalyzerBase has been renamed to Analyzer. All Analyzer implementations must now use Analyzer.TokenStreamComponents, rather than overriding .tokenStream() and .reusableTokenStream() (which are now final).

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

  1. “未为 CharReader 类型定义方法 get(Reader)”

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

  1. “TermPositionVector 无法解析为类型”

这个类现在在 Lucene 4 中已经消失了。有什么简单的修复方法吗?来自更改日志:

The term vectors APIs (TermFreqVector, TermPositionVector, TermVectorMapper) have been removed in favor of the above flexible indexing APIs, presenting a single-document inverted index of the document from the term vectors.

可能与此有关:

  1. “未为 IndexReader 类型定义方法 getTermFreqVector(int, String)。”

这两个问题都出现在这里,例如:

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

(“阅读器”属于 IndexReader 类型)

对于这些问题,我将不胜感激。

最佳答案

我找到核心开发者Uwe Schindlerresponse在 Lucene 邮件列表上回答您的问题。我花了一些时间来了解新的 API,所以我需要在忘记之前写下一些东西。

这些说明适用于 Lucene 4.10.3。

实现分析器(1-2)

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 的构造函数需要一个源和一个汇。接收器是您的 token 流的最终结果,由 Analyzer.tokenStream() 返回,因此将其设置为您的过滤器链。源是应用任何过滤器之前的 token 流。
  2. HTMLStripCharFilter ,尽管它的名称,实际上是 java.io.Reader 的子类,它删除了 HTML 结构,因此您不再需要 CharReader。

词 vector 替换(3-4)

术语 vector 在 Lucene 4 中的工作方式不同,因此没有直接的方法交换。具体答案取决于您的要求。

如果你想要位置信息,你必须首先用位置信息索引你的字段:

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(改编自 this answer):

// 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() 返回一个实际的 Iterable 就好了。

关于java - 将 Lucene 从 3.5 升级到 4.10 - 如何处理 Java API 更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27881296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com