gpt4 book ai didi

java - Lucene 3.5 自定义负载

转载 作者:搜寻专家 更新时间:2023-11-01 03:43:20 25 4
gpt4 key购买 nike

使用 Lucene 索引,我有一个看起来像这样的标准文档格式:

Name: John Doe 
Job: Plumber
Hobby: Fishing

我的目标是将有效负载附加到作业字段,该字段将包含有关管道的其他信息,例如,指向管道文章的维基百科链接。我不想将有效载荷放在其他任何地方。最初,我找到了一个涵盖了我想做的事情的例子,但它使用了 Lucene 2.2,并且没有更新来反射(reflect) token 流 api 中的变化。经过更多研究后,我想到了这个小怪物来为该领域构建自定义 token 流。

public static TokenStream tokenStream(final String fieldName, Reader reader, Analyzer analyzer, final String item) {
final TokenStream ts = analyzer.tokenStream(fieldName, reader) ;
TokenStream res = new TokenStream() {
CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
PayloadAttribute payAtt = addAttribute(PayloadAttribute.class);

public boolean incrementToken() throws IOException {
while(true) {
boolean hasNext = ts.incrementToken();
if(hasNext) {
termAtt.append("test");
payAtt.setPayload(new Payload(item.getBytes()));
}
return hasNext;
}
}

};
return res;
}

当我获取 token 流并遍历所有结果时,在将其添加到字段之前,我看到它成功地将术语和有效负载配对。在流上调用 reset() 之后,我将其添加到文档字段并为文档编制索引。但是,当我打印出文档并与 Luke 一起查看索引时,我的自定义 token 流没有成功。字段名称正确显示,但 token 流中的术语值未出现,也不表示有效负载已成功附加。

这引出了两个问题。首先,我是否正确使用了 token 流?如果是,为什么当我将它添加到字段时它没有被 token 化?其次,如果我没有正确使用流,是否需要自己编写分析器。这个例子是使用 Lucene 标准分析器拼凑起来的,以生成 token 流并编写文档。如果可能,我想避免编写自己的分析器,因为我只想将有效负载附加到一个字段!

编辑:

调用代码

TokenStream ts = tokenStream("field", new StringReader("value"), a, docValue);
CharTermAttribute cta = ts.getAttribute(CharTermAttribute.class);
PayloadAttribute payload = ts.getAttribute(PayloadAttribute.class);
while(ts.incrementToken()) {
System.out.println("Term = " + cta.toString());
System.out.println("Payload = " + new String(payload.getPayload().getData()));

}
ts.reset();

最佳答案

很难说出为什么没有保存有效载荷,原因可能在于使用您提供的方法的代码。

设置有效负载的最方便的方法是在 TokenFilter 中——我认为采用这种方法将为您提供更简洁的代码,进而使您的场景正常工作。我认为在 Lucene 源代码中看一下这种类型的过滤器最能说明问题,例如TokenOffsetPayloadTokenFilter .您可以在 test for this class 中找到如何使用它的示例。 .

还请考虑是否没有比有效负载更好的地方来存储这些超链接。有效载荷有非常特殊的应用,例如根据它们在原始文档中的位置或格式、词性来提升一些术语……它们的主要目的是影响搜索的执行方式,因此它们通常是数值,有效地打包以减少索引大小。

关于java - Lucene 3.5 自定义负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9130577/

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