改变索引(贴子)Lucene的结构

Change Indexing(Postings)Structure of Lucene

我正在研究索引文档的新方法。具体来说,我想 更改现有索引结构以试验索引技术。例如,如果 Lucene 具有在索引时保存术语和文档 ID 的倒排索引,我想扩展该结构以保存其他信息,例如关于术语的位置或统计信息。我将如何进行此类扩展?有没有比 Lucene 更好的开源项目来做这样的扩展?谢谢。

Lucene 是一个很好的目标,是的(老实说,不确定是否有更好的选择)。

我想您最终会创建自定义编解码器。请参阅 this blog post, from the main man behind the current codec stuff in modern Lucene. He mentions there the useful SimpleTextCodec,这将使您能够理解和使用编解码器。当然不用于生产。

For example if Lucene has inverted index that saves term and Doc Id's at indexing time, I would like to extend that structure to save other information such as position or statistics about the term...

Lucene 中的每个帖子条目都非常通用。 Lucene 已经提供了在与每个帖子条目关联的 payload 对象的帮助下以字节流的形式保存通用类型(对象)的规定。

有效负载的一个非常常见的用途是存储术语位置。例如,对于术语 t,如果它出现在文档 D1 的位置 1 和 3,以及出现在 D2 的位置 2 和 5,您可以将它们保存为不同的条目t,如下图

*t* => (D1,1) (D1,3) (D2, 2) (D2, 5)

最简单的方法是使用 Lucene class 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 class 在文档排名期间使用这些术语偏移量。

大声思考,我认为存储其他术语特定信息对您来说是一个很好的练习,可以是 - i) 术语的词性 (POS) 标签,ii) 术语的词向量等。 ,在有效负载中,并在排名期间结合使用所有这些功能。