[ 
https://issues.apache.org/jira/browse/SOLR-15308?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Matt Hov updated SOLR-15308:
----------------------------
    Component/s: SearchComponents - other

> ScoreJoinQParserPlugin chooses wrong Index when nesting more than 1 
> cross-index join query
> ------------------------------------------------------------------------------------------
>
>                 Key: SOLR-15308
>                 URL: https://issues.apache.org/jira/browse/SOLR-15308
>             Project: Solr
>          Issue Type: Bug
>      Security Level: Public(Default Security Level. Issues are Public) 
>          Components: query parsers, SearchComponents - other
>    Affects Versions: 8.8.1
>         Environment: ubuntu 20.04, SOLR 8.8.1
>            Reporter: Matt Hov
>            Priority: Minor
>              Labels: JOIN, join, parser, scorer
>
> In this situation i have 2 cores "nodes" and "edges" and I wish to join 
> across them WITH the performance enhancements of the "score=none" join param.
> If I debug the following query (get me the child nodes of a child nodes of 
> parentid:1, joined back to nodes core)
> {code:java}
> /solr/nodes/select?q=*:*&debugQuery=true
> &fq={!join from=childid to=id score=none fromIndex=edges v=$q2}
> &q0=parentid:1
> &q1={!join from=childid to=parentid score=none fromIndex=edges v=$q0}
> &q2={!join from=childid to=parentid score=none fromIndex=edges v=$q1}
> &rows=0
> {code}
> parsed_filter_queries shows the following 
> {code:java}
> OtherCoreJoinQuery(OtherCoreJoinQuery [fromIndex=edges, 
> fromCoreOpenTime=608579757538032 extends SameCoreJoinQuery 
> [fromQuery=SameCoreJoinQuery [fromQuery=SameCoreJoinQuery 
> [fromQuery=parentid:1, fromField=childid, toField=parentid, scoreMode=None], 
> fromField=childid, toField=parentid, scoreMode=None], fromField=childid, 
> toField=id, scoreMode=None]])
> {code}
> Where all the nested joins are parsed as SameCoreJoinQuery, now I might 
> expect that since the first join is the "edges" core (query is on "nodes"), 
> that the child joins would be the Same core as the first OtherCoreJoinQuery 
> parent query. However if you look at ScoreJoinQParserPlugin.java:159  (under 
> SameCoreJoinQuery)
>  
> {code:java}
> @Override
> public Weight createWeight(IndexSearcher searcher, 
> org.apache.lucene.search.ScoreMode scoreMode, float boost) throws IOException 
> {
>   SolrRequestInfo info = SolrRequestInfo.getRequestInfo();
>   final Query jq = JoinUtil.createJoinQuery(fromField, true,
>       toField, fromQuery, info.getReq().getSearcher(), this.scoreMode);
>   return jq.rewrite(searcher.getIndexReader()).createWeight(searcher, 
> scoreMode, boost);
> }
> {code}
> "info.getReq().getSearcher()" will always be the searcher for the main 
> index/core "nodes" not the parent OtherCoreJoinQuery index "edges"
>  
> I noticed undocumented test params "TESTenforceSameCoreAsAnotherOne" and if I 
> add them to each query 
> {code:java}
> /solr/nodes/select?q=*:*&debugQuery=true
> &fq={!join from=childid to=id score=none fromIndex=edges 
> TESTenforceSameCoreAsAnotherOne=true v=$q2}
> &q0=parentid:1
> &q1={!join from=childid to=parentid score=none fromIndex=edges 
> TESTenforceSameCoreAsAnotherOne=true v=$q0}
> &q2={!join from=childid to=parentid score=none fromIndex=edges 
> TESTenforceSameCoreAsAnotherOne=true v=$q1}
> &rows=0
> {code}
> I'll receive this parsed_filter_queries
> {code:java}
> OtherCoreJoinQuery(OtherCoreJoinQuery [fromIndex=edges, 
> fromCoreOpenTime=608579757538032 extends SameCoreJoinQuery 
> [fromQuery=OtherCoreJoinQuery [fromIndex=edges, 
> fromCoreOpenTime=608579757538032 extends SameCoreJoinQuery 
> [fromQuery=OtherCoreJoinQuery [fromIndex=edges, 
> fromCoreOpenTime=608579757538032 extends SameCoreJoinQuery 
> [fromQuery=parentid:1, fromField=childid, toField=parentid, scoreMode=None]], 
> fromField=childid, toField=parentid, scoreMode=None]], fromField=childid, 
> toField=id, scoreMode=None]])
> {code}
> which gives me what I'd expect and the correct results.  So I have this as a 
> workaround in the meantime. 
> So I guess the solution depends on what you meant to happen, should a 
> cross-index join under a cross-index join (of the same index) be a 
> SameCoreJoinQuery?
> if that's the case then replace "info.getReq().getSearcher()" with "searcher" 
> in SameCoreJoinQuery.createWeight(...)
> if it should be a OtherCoreJoinQuery like it's parent join query, then 
> ScoreJoinQParserPlugin.java:228
> {code:java}
> final String myCore = req.getCore().getCoreDescriptor().getName();
> {code}
> should be getting the top level coreName from 
> "SolrRequestInfo.getRequestInfo().getReq().getCore()"
>  
> Thanks
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to