Skip to content

Commit 03e4d33

Browse files
authored
SOLR-18039: Support repeated parents.preFilter in KnnQParser (#4139)
Signed-off-by: Arup Chauhan <arupchauhan.connect@gmail.com>
1 parent b71c872 commit 03e4d33

File tree

3 files changed

+41
-9
lines changed

3 files changed

+41
-9
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# See https://github.com/apache/solr/blob/main/dev-docs/changelog.adoc
2+
title: Support repeated parents.preFilter values in nested vector knn queries
3+
type: fixed # added, changed, fixed, deprecated, removed, dependency_update, security, other
4+
authors:
5+
- name: Arup Chauhan
6+
nick: arup-chauhan
7+
links:
8+
- name: SOLR-18039
9+
url: https://issues.apache.org/jira/browse/SOLR-18039

solr/core/src/java/org/apache/solr/search/vector/KnnQParser.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,11 @@ public Query parse() throws SyntaxError {
133133
final Integer filteredSearchThreshold = localParams.getInt(FILTERED_SEARCH_THRESHOLD);
134134

135135
// check for parent diversification logic...
136-
final String parentsFilterQuery = localParams.get(PARENTS_PRE_FILTER);
136+
final String[] parentsFilterQueries = localParams.getParams(PARENTS_PRE_FILTER);
137137
final String allParentsQuery = localParams.get(CHILDREN_OF);
138138

139-
boolean isDiversifyingChildrenKnnQuery = null != parentsFilterQuery || null != allParentsQuery;
139+
boolean isDiversifyingChildrenKnnQuery =
140+
null != parentsFilterQueries || null != allParentsQuery;
140141
if (isDiversifyingChildrenKnnQuery) {
141142
if (null == allParentsQuery) {
142143
throw new SolrException(
@@ -150,7 +151,7 @@ public Query parse() throws SyntaxError {
150151
final BitSetProducer allParentsBitSet =
151152
BlockJoinParentQParser.getCachedBitSetProducer(
152153
req, subQuery(allParentsQuery, null).getQuery());
153-
final BooleanQuery acceptedParents = getParentsFilter(parentsFilterQuery);
154+
final BooleanQuery acceptedParents = getParentsFilter(parentsFilterQueries);
154155

155156
Query acceptedChildren =
156157
getChildrenFilter(getFilterQuery(), acceptedParents, allParentsBitSet);
@@ -183,14 +184,19 @@ public Query parse() throws SyntaxError {
183184
filteredSearchThreshold);
184185
}
185186

186-
private BooleanQuery getParentsFilter(String parentsFilterQuery) throws SyntaxError {
187+
private BooleanQuery getParentsFilter(String[] parentsFilterQueries) throws SyntaxError {
187188
BooleanQuery.Builder acceptedParentsBuilder = new BooleanQuery.Builder();
188-
if (parentsFilterQuery != null) {
189-
final Query parentsFilter = subQuery(parentsFilterQuery, null).getQuery();
190-
acceptedParentsBuilder.add(parentsFilter, BooleanClause.Occur.FILTER);
189+
if (parentsFilterQueries != null) {
190+
for (String parentsFilterQuery : parentsFilterQueries) {
191+
final QParser parser = subQuery(parentsFilterQuery, null);
192+
parser.setIsFilter(true);
193+
final Query parentsFilter = parser.getQuery();
194+
if (parentsFilter != null) {
195+
acceptedParentsBuilder.add(parentsFilter, BooleanClause.Occur.FILTER);
196+
}
197+
}
191198
}
192-
BooleanQuery acceptedParents = acceptedParentsBuilder.build();
193-
return acceptedParents;
199+
return acceptedParentsBuilder.build();
194200
}
195201

196202
private Query getChildrenFilter(

solr/core/src/test/org/apache/solr/search/join/BlockJoinNestedVectorsQParserTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,23 @@ public void parentRetrievalFloat_knnChildrenWithParentFilter_shouldReturnKnnPare
229229
"//result/doc[3]/str[@name='id'][.='2']");
230230
}
231231

232+
@Test
233+
public void parentRetrievalFloat_knnChildrenWithMultipleParentFilters_shouldReturnKnnParents() {
234+
assertQ(
235+
req(
236+
"q", "{!parent which=$allParents score=max v=$children.q}",
237+
"fl", "id,score",
238+
"children.q",
239+
"{!knn f=vector topK=3 parents.preFilter=$parentFilter1 parents.preFilter=$parentFilter2 childrenOf=$allParents}"
240+
+ FLOAT_QUERY_VECTOR,
241+
"allParents", "parent_s:[* TO *]",
242+
"parentFilter1", "parent_s:(a c)",
243+
"parentFilter2", "parent_s:(c e)"),
244+
"//*[@numFound='2']",
245+
"//result/doc[1]/str[@name='id'][.='8']",
246+
"//result/doc[2]/str[@name='id'][.='2']");
247+
}
248+
232249
@Test
233250
public void
234251
parentRetrievalFloat_knnChildrenWithParentFilterAndChildrenFilter_shouldReturnKnnParents() {

0 commit comments

Comments
 (0)