Lucene-如何在给定父文档ID的情况下获取父模块中的所有子文档

Ben

我正在直接使用Lucene(没有Solr或ElasticSearch)来索引一组遵循父子层次结构的文档。

我使用“块”来实现此目的,方法是将所有子代,然后将父代添加到同一块调用中:

writer.addDocuments(childrenAndParentDocList)

我正在所有父级和子级之间进行自由文本搜索(使用子级搜索中的ToParentBlockJoinQuery链接到父级文档),这将返回一组不错的父级文档,这些文档要么与查询匹配,要么与子文档匹配查询。

我需要做的下一件事是为我拥有的所有父级文档获取所有子级

我在这里的Lucene测试中看到了一种方法,该方法展示了如何在给定子文档的情况下获取父文档。

  private Document getParentDoc(IndexReader reader, BitSetProducer parents, int childDocID) throws IOException {
    final List<LeafReaderContext> leaves = reader.leaves();
    final int subIndex = ReaderUtil.subIndex(childDocID, leaves);
    final LeafReaderContext leaf = leaves.get(subIndex);
    final BitSet bits = parents.getBitSet(leaf);
    return leaf.reader().document(bits.nextSetBit(childDocID - leaf.docBase));
  }

但是我不确定该怎么做。即如何获取给定父级文档的所有子级。

任何意见,将不胜感激。

Ben

我最终使用了下面的代码。它似乎起作用:

private List<Integer> getChildDocIds(IndexSearcher indexSearcher, int parentDocId) throws IOException {
    //Use a query in QueryBitSetProducer constructor which identifies parent docs
    BitSetProducer parentsFilter = new QueryBitSetProducer(new TermQuery(new Term("child", "N")));
    IndexReader indexReader = indexSearcher.getIndexReader();
    List<LeafReaderContext> leaves = indexReader.leaves();
    int subIndex = ReaderUtil.subIndex(parentDocId, leaves);
    LeafReaderContext leaf = leaves.get(subIndex);
    int localParentDocId = parentDocId - leaf.docBase;
    List<Integer> childDocs = new ArrayList<>();
    if (localParentDocId == 0) { 
        //not a parent, or parent has no children
        return childDocs;
    }
    int prevParent = parentsFilter.getBitSet(leaf).prevSetBit(localParentDocId - 1);
    for(int childDocIndex = prevParent + 1; childDocIndex < localParentDocId; childDocIndex++) {
        childDocs.add(leaf.docBase + childDocIndex);
    }
    return childDocs;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章