【发布时间】:2017-11-10 16:54:17
【问题描述】:
我正在研究索引文档的新方法。具体来说,我想 改变现有的索引结构以试验索引技术。例如,如果 Lucene 具有在索引时保存术语和 Doc Id 的倒排索引,我想扩展该结构以保存其他信息,例如关于术语的位置或统计信息。我将如何进行此类扩展?有没有比 Lucene 更好的开源项目来做这样的扩展?谢谢。
【问题讨论】:
标签: solr lucene information-retrieval inverted-index
我正在研究索引文档的新方法。具体来说,我想 改变现有的索引结构以试验索引技术。例如,如果 Lucene 具有在索引时保存术语和 Doc Id 的倒排索引,我想扩展该结构以保存其他信息,例如关于术语的位置或统计信息。我将如何进行此类扩展?有没有比 Lucene 更好的开源项目来做这样的扩展?谢谢。
【问题讨论】:
标签: solr lucene information-retrieval inverted-index
例如,如果 Lucene 具有在索引时保存术语和 Doc Id 的倒排索引,我想扩展该结构以保存其他信息,例如关于术语的位置或统计信息...
Lucene 中的每个帖子条目都非常通用。 Lucene 已经提供了以字节流的形式保存泛型类型(对象)的规定,这要借助与每个发布条目关联的 payload 对象。
有效载荷的一个非常常见的用途是存储术语位置。例如,对于一个术语 t,如果它出现在文档 D1 的位置 1 和 3,以及 D2 的位置 2 和 5,您可以将这些作为不同的条目保存在 的帖子中t,如下图。
*t* => (D1,1) (D1,3) (D2, 2) (D2, 5)
最简单的方法是使用 Lucene 类 DelimitedPayloadTokenFilter。在分析文本时,您需要做的就是在每个术语旁边写出术语位置,由特定字符分隔,例如'|',如下例所示。
class PayloadAnalyzer extends Analyzer {
private PayloadEncoder encoder;
PayloadAnalyzer(PayloadEncoder encoder) {
this.encoder = encoder;
}
public TokenStream tokenStream(String fieldName, Reader reader) {
TokenStream result = new WhitespaceTokenizer(reader);
result = new LowerCaseFilter(result);
result = new DelimitedPayloadTokenFilter(result, '|', encoder);
return result;
}
}
要解码存储在有效负载中的值,您可以使用以下内容。
class PayloadSimilarity extends DefaultSimilarity {
@Override
public float scorePayload(String fieldName, byte[] bytes, int offset, int length) {
return PayloadHelper.decodeFloat(bytes, offset);
}
}
然后您可以使用PayloadTermQuery 类在文档排名期间利用这些术语偏移量。
大声思考,我认为对您来说一个很好的练习是存储其他术语特定信息,可能是 -i)术语的词性(POS)标签,ii)术语的词向量等,在有效载荷并在排名期间使用所有这些功能的组合。
【讨论】:
Lucene 是一个很好的目标,是的(说实话,不确定是否有更好的选择)。
我猜你最终会创建你的自定义编解码器。请参阅this blog post,来自现代 Lucene 中当前编解码器背后的主要人物。他在那里提到了有用的SimpleTextCodec,它可以让您理解和使用编解码器。当然,不用于生产用途。
【讨论】: