Alan - thanks for the reply.  Given your explanation is there an off by one 
term issue?   The matches I'm seeing would happen if the last term weren't 
considered. 

Do you have an example of multiple payloads too?

    Erik

> On Apr 25, 2017, at 04:16, Alan Woodward <[email protected]> wrote:
> 
> 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 <[email protected]> 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: [email protected]
>> For additional commands, e-mail: [email protected]
>> 
> 

Reply via email to