cts.notInQuery( positive-query as cts.query, negative-query as cts.query ) as cts.notInQuery
Returns a query matching the first sub-query, where those matches do not occur within 0 distance of the other query.
Parameters | |
---|---|
positive-query | A positive query, specifying the search results filtered in. |
negative-query | A negative query, specifying the search results to filter out. |
Positions are required to accurately resolve this query from the indexes.
If you do not enable position indexes appropriate to the type of the
sub-queries, then you may get surprising results in unfiltered searches.
For example, if the sub queries are cts:word-query
, then
you should enable word positions in the database.
False positives can occur if there are no positions available, such as when positions are not enabled. Filtered searches always have access to positions, but unfiltered searches do not.
Some query types are intrinsically positionless, such as
cts:collection-query
or cts:directory-query
.
Matches to such a query are considered to occur at every position and
causes the overall query to behave like cst:and-not-query
.
If no position can be determined, such as when positions are not enabled,
then every match to $positive-query
is a match for the
whole query.
cts.search(cts.notInQuery( cts.wordQuery("nettles"), cts.wordQuery("stinging nettles"))) => A sequence of documents containing some text node with the word 'nettles' where that occurrence is not in the phrase 'stinging nettles'.This sequence may be (in fact is) non-empty, but certainly does not contain the PLAY element with: PLAY/TITLE = "The Tragedy of King Richard the Second" since, while this play does contain 'nettles', it is only in the phrase 'stinging nettles'. On the other hand, this play will match the query: cts.search(cts.notInQuery( cts.wordQuery("summer"), cts.wordQuery("summer corn"))) since, while the play does contain 'summer corn', it also contains 'summer' in other contexts as well. If word positions are not enabled, then an unfiltered search returns all documents containing "nettles".
cts.search(cts.notInQuery( cts.wordQuery("nettles"), cts.collectionQuery("TRAGEDY"))) => A sequence of documents containing some text node with the word "nettles", excluding occurrences in documents in the "TRAGEDY" collection. The collection query is intrinsically, positionless, so the negative query matches overlap with every match of the positive query.