0

我正在尝试使用 lucene - toChildBlockJoinQuery 进行搜索。我有一个父文档(具有字段 A、B、C 和 DocType:“父”过滤器)和每个父文档的一组子文档(每个子文档都有字段 D、E)并按顺序编入索引 - 一组子文档然后是父文档。

我正在尝试查询具有 B:"somevalue" AND (D:"value1" or D:"value2" or D:"value3" ..) 的文档

我正在使用 ToChildBlockJoinQuery 按父字段值过滤文档,然后添加子字段值查询并搜索索引。

在下面找到我的代码:

Query parentFilter = new TermQuery(new Term("DocumentType","parent"));
Filter parent= new CachingWrapperFilter(new QueryWrapperFilter(parentFilter));
TermQuery B= new TermQuery(new Term("B",somevalue));
parentQuery.add(B, Occur.MUST);
ToChildBlockJoinQuery blockJoinQuery = new ToChildBlockJoinQuery(parentQuery , filter, false);

BooleanQuery D= new BooleanQuery();
for(int m=0; m< dValues.length; m++){
D.add( new TermQuery(new Term("D", dValues[m])), Occur.SHOULD);
}
BooleanQuery innerQuery = new BooleanQuery();
innerQuery.add(blockJoinQuery,Occur.MUST);
innerQuery.add(D,Occur.MUST);

TopDocs tD = this.searcher.search(innerQuery, 10);   // or
TopDocs tD = this.searcher.search(blockJoinQuery, 10);

两者都给了我 0 个结果。我能够使用不同的 ToParentBlockJoinQuery 获取所有索引文档并将子句更改为发生。应该。我可以看到匹配的文档在通用结果中。但是,如果我使用上述查询,我​​将无法获取任何结果。

不确定我是否对 ToChildBlockJoinQuery 做错了什么。任何帮助表示赞赏!

//编辑了这篇文章//这是我索引文档的方式:

public void indexParentAndChildDoc(String A, String B, String C){
/**
*This part has code to get values A, B and C
**/
for (int i = 0; i <elementS.length; i++){

    String D, E1, E2 = null;
    D = //code to get value for D
    E1 = //code to get value for E1;
    E2 = //code to get value for E2;
documents.add(createChildDocs(D,E1, E2));
}

documents.add(createParentDoc(A, B, C));
if (writer.getConfig().getOpenMode() == IndexWriterConfig.OpenMode.CREATE_OR_APPEND){
writer.addDocuments(documents);
}
documents.clear();
}

private Document createParentDoc(String A, String B, String C){ 
Document document = new Document();
document.add(new Field("A", A, TextField.TYPE_STORED));
document.add(new Field("B", B, TextField.TYPE_STORED));
document.add(new Field("C", C, TextField.TYPE_STORED));
document.add(new Field("DocumentType", "parent", TextField.TYPE_NOT_STORED));
return document;
}

private Document createChildDocs(String D, String E1 String E2) {

Document document = new Document();
document.add(new Field("D", D, TextField.TYPE_STORED));
    document.add(new Field("E", E1+":"+E2, TextField.TYPE_STORED));
    return document;
}

//This code indexes parent docs along with the related child docs
String[] elementS = //child objects of this parent
indexParentAndChildDoc("valueA", "somevalue", "valueC");

搜索提供上述代码的此索引文档不会获取任何结果。

4

0 回答 0