Requiring exact-phrase matches may be too strict a constraint. Perhaps we do
want documents that contain quick brown fox'' to be considered a match for
the query
quick fox,'' even though the positions aren’t exactly equivalent.
We can introduce a degree of flexibility into phrase matching by using the
slop
parameter:
GET /my_index/my_type/_search
{
"query": {
"match_phrase": {
"title": {
"query": "quick fox",
"slop": 1
}
}
}
}
The slop
parameter tells the match_phrase
query how far apart terms are
allowed to be while still considering the document a match. By how far
apart we mean how many times do you need to move a term in order to make
the query and document match?
We’ll start with a simple example. To make the query quick fox
match
a document containing quick brown fox
we need a slop
of just 1
:
Pos 1 Pos 2 Pos 3 ----------------------------------------------- Doc: quick brown fox ----------------------------------------------- Query: quick fox Slop 1: quick ↳ fox
Although all words need to be present in phrase matching, even when using slop
,
the words don’t necessarily need to be in the same sequence in order to
match. With a high enough slop
value, words can be arranged in any order.
To make the query fox quick
match our document, we need a slop
of 3
:
Pos 1 Pos 2 Pos 3 ----------------------------------------------- Doc: quick brown fox ----------------------------------------------- Query: fox quick Slop 1: fox|quick ↵ (1) Slop 2: quick ↳ fox Slop 3: quick ↳ fox
-
Note that
fox
andquick
occupy the same position in this step. Switching word order fromfox quick
toquick fox
thus requires two steps, or aslop
of2
.