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 >