The query will only match a particular span if all the payloads in that span 
match the passed-in array.  So for example, in your first query, the inner 
spanNear query matches two terms (words_dps:one and words_dps:two), so it needs 
to have an array of two payloads to match.

You can use it for, for example, parts-of-speech tagging; 
spanPayCheck(spanTerm(text:run), payloadRef:noun) would only match instances of 
‘run’ that are tagged as a noun, rather than a verb.

I can see a case for a separate query that only matches when all of a span’s 
payloads match a single payload value

Alan Woodward
www.flax.co.uk


> On 25 Apr 2017, at 01:40, Erik Hatcher <erik.hatc...@gmail.com> wrote:
> 
> 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: dev-unsubscr...@lucene.apache.org
> For additional commands, e-mail: dev-h...@lucene.apache.org
> 

Reply via email to