gpt4 book ai didi

html - 如何增加 lucene 索引中的位置偏移以对应于

标签?

转载 作者:太空狗 更新时间:2023-10-29 14:10:15 25 4
gpt4 key购买 nike

我正在使用 Lucene 3.0.3。在准备使用 SpanQuery 和 PhraseQuery 时,我想在我的索引中标记段落边界,以阻止这些查询跨段落边界匹配。我知道我需要在 PositionIncrementAttribute 中将位置增加一些适当大的值处理文本以标记段落边界时。假设在源文档中,我的段落边界标记为 <p>...</p>对。

如何设置我的 token 流来检测标签?另外,我实际上并不想索引标签本身。出于索引的目的,我宁愿增加下一个合法 token 的位置,而不是发出与标签相对应的 token ,因为我不希望它影响搜索。

最佳答案

添加间隙 (= PositionIncrement > 1) 的最简单方法是提供自定义 TokenStream。您不需要为此更改您的分析器。但是,HTML 解析应该在上游完成(即,您应该在将输入文本提供给 Lucene 之前相应地对其进行分段和清理)。

这是一个完整的工作示例(省略了导入):

public class GapTest {

public static void main(String[] args) throws Exception {
final Directory dir = new RAMDirectory();
final IndexWriterConfig iwConfig = new IndexWriterConfig(Version.LUCENE_4_10_1, new SimpleAnalyzer());
final IndexWriter iw = new IndexWriter(dir, iwConfig);

Document doc = new Document();
doc.add(new TextField("body", "A B C", Store.YES));
doc.add(new TextField("body", new PositionIncrementTokenStream(10)));
doc.add(new TextField("body", "D E F", Store.YES));

System.out.println(doc);
iw.addDocument(doc);
iw.close();

final IndexReader ir = DirectoryReader.open(dir);
IndexSearcher is = new IndexSearcher(ir);

QueryParser qp = new QueryParser("body", new SimpleAnalyzer());

for (String q : new String[] { "\"A B C\"", "\"A B C D\"",
"\"A B C D\"", "\"A B C D\"~10", "\"A B C D E F\"~10",
"\"A B C D F E\"~10", "\"A B C D F E\"~11" }) {
Query query = qp.parse(q);
TopDocs docs = is.search(query, 10);
System.out.println(docs.totalHits + "\t" + q);
}
ir.close();
}

/**
* A gaps-only TokenStream (uses {@link PositionIncrementAttribute}
*
* @author Christian Kohlschuetter
*/
private static final class PositionIncrementTokenStream extends TokenStream {
private boolean first = true;
private PositionIncrementAttribute attribute;
private final int positionIncrement;

public PositionIncrementTokenStream(final int positionIncrement) {
super();
this.positionIncrement = positionIncrement;
attribute = addAttribute(PositionIncrementAttribute.class);
}

@Override
public boolean incrementToken() throws IOException {
if (first) {
first = false;
attribute.setPositionIncrement(positionIncrement);
return true;
} else {
return false;
}
}

@Override
public void reset() throws IOException {
super.reset();
first = true;
}
}

关于html - 如何增加 lucene 索引中的位置偏移以对应于 <p> 标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5749632/

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