Lucene - как получить все дочерние документы в родительском блоке с учетом родительского docID - PullRequest
0 голосов
/ 26 апреля 2019

Я использую прямой 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));
  }

Но я не уверен, как поступить наоборот. то есть как получить всех детей по родительскому документу.

Любой совет будет оценен.

1 Ответ

0 голосов
/ 04 июня 2019

В итоге я использовал код ниже.И, похоже, работает:

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...