我正在尝试使用 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");
搜索提供上述代码的此索引文档不会获取任何结果。