I’ve started a belated mission to leverage payloads from Solr (SOLR-1485), 
mainly from float payload decoding for weighting in scoring, but while digging 
in I’m exploring all that payloads now have to offer including the 
SpanPayloadCheckQuery.   However, I’m not yet understanding how to use it 
effectively, and what kinds of use cases it _really_ is and can be used for.  

I think it isn’t working as it should, or at least I’m not understanding its 
behavior.    Here’s what I’m indexing, by way of the 
DelimitedPayloadTokenFilter:

    one|A two|B three|C

and making the following queries (these translate to SpanNearQuery with zero 
slop and inOrder=true):

  spanPayCheck(spanNear([words_dps:one, words_dps:two], 0, true), payloadRef: 
A;)
  *spanPayCheck(spanNear([words_dps:one, words_dps:two], 0, true), payloadRef: 
A;B;)
  spanPayCheck(spanNear([words_dps:one, words_dps:two], 0, true), payloadRef: 
A;B;C;)
  spanPayCheck(spanNear([words_dps:two, words_dps:three], 0, true), payloadRef: 
A;)
  *spanPayCheck(spanNear([words_dps:two, words_dps:three], 0, true), 
payloadRef: A;B;)
  spanPayCheck(spanNear([words_dps:two, words_dps:three], 0, true), payloadRef: 
A;B;C;)
  spanPayCheck(spanNear([words_dps:one, words_dps:two, words_dps:three], 0, 
true), payloadRef: A;)
  *spanPayCheck(spanNear([words_dps:one, words_dps:two, words_dps:three], 0, 
true), payloadRef: A;B;)
  spanPayCheck(spanNear([words_dps:one, words_dps:two, words_dps:three], 0, 
true), payloadRef: A;B;C;)

Only the ones(*) with the payloads array set to “A” and “B” did it match, all 
the others failed to match.   Is that expected?   I’m confused on how the 
SpanPayloadCheckQuery uses this payloads array to further filter the matches on 
the associated SpanQuery.

Could/would someone explain how this query works and why these matches are 
working as they are?  Thanks!

Here’s my test platform below:

——

bin/post -c payloads -type text/csv -out yes -d $'id,words_dps\n1,one|A two|B 
three|C'
curl http://localhost:8983/solr/payloads/config/params -H 
'Content-type:application/json'  -d '{
"set" : {
  "payload-checks": {
    "wt":"json",
    "indent":"on",
    "debug":"query",
    "echoParams":"all",
    "facet":"on",
    "facet.query": [ 
         "{!payload_check key=one-two-A f=words_dps payloads=\"A\"}one two",
         "{!payload_check key=one-two-AB f=words_dps payloads=\"A B\"}one two",
         "{!payload_check key=one-two-ABC f=words_dps payloads=\"A B C\"}one 
two",
         "{!payload_check key=two-three-A f=words_dps payloads=\"A\"}two three",
         "{!payload_check key=two-three-AB f=words_dps payloads=\"A B\"}two 
three",
         "{!payload_check key=two-three-ABC f=words_dps payloads=\"A B C\"}two 
three",
         "{!payload_check key=one-two-three-A f=words_dps payloads=\"A\"}one 
two three",
         "{!payload_check key=one-two-three-AB f=words_dps payloads=\"A B\"}one 
two three",
         "{!payload_check key=one-two-three-ABC f=words_dps payloads=\"A B 
C\"}one two three"
      ]
    }
  }
}'   
curl "http://localhost:8983/solr/payloads/select?q=*:*&useParams=payload-checks”

        • facet_queries: {
                • one-two-A: 0,
                • one-two-AB: 1,
                • one-two-ABC: 0,
                • two-three-A: 0,
                • two-three-AB: 1,
                • two-three-ABC: 0,
                • one-two-three-A: 0,
                • one-two-three-AB: 1,
                • one-two-three-ABC: 0
},

—

// not necessarily the latest code on SOLR-1485 - construction zone
      public Query parse() throws SyntaxError {
        String field = localParams.get(QueryParsing.F);
        String value = localParams.get(QueryParsing.V);
        String pStr = localParams.get("payloads","");

        IdentityEncoder encoder = new IdentityEncoder();
        List<BytesRef> payloads = new ArrayList<>();
        String[] rawPayloads = pStr.split(" ");
        for (String rawPayload : rawPayloads) {
          payloads.add(encoder.encode(rawPayload.toCharArray()));
        }

        String[] terms = value.split(" ");
        List<SpanQuery> stqs = new ArrayList<SpanQuery>();
        for (String term : terms) {
          stqs.add(new SpanTermQuery(new Term(field, term)));
        }
        SpanNearQuery snq = new SpanNearQuery(stqs.toArray(new SpanQuery[0]), 
0, true);

        Query spcq = new SpanPayloadCheckQuery(snq, payloads);

        return spcq;
      }
    };


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

Reply via email to