{
"id": 5,
"title": "Quick Brown fox jumps over the lazy dog",
"genre": [
"fiction"
]
}
{
"movies" : {
"mappings" : {
"properties" : {
"genre" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"id" : {
"type" : "long"
},
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
{
"query": {
"match_phrase": {
"title": {
"query": "fox quick over", "slop": 3
}
}
}
}
{
"query": {
"match_phrase": {
"title": {
"query": "over fox quick", "slop": 3
}
}
}
}
I was expecting a result in query2 rather than in query 1.
Slop
Number of times you need to move a term in order to make the query and document match.
Switching word order requires two edits/steps
Below is movement of words
Query 1:
Pos 1 Pos 2 Pos 3 Pos 4 Pos 5 Pos 6 Pos 7 Pos 8 -------------------------------------------------------------------------------------- Doc: quick brown fox jumps over the lazy dog --------------------------------------------------------------------------------------- Query: fox quick over Slop 1: fox|quick over Slop 2: quick fox over Slop 3: quick fox over
total steps 3
Query 2:
Pos 1 Pos 2 Pos 3 Pos 4 Pos 5 Pos 6 Pos 7 Pos 8 -------------------------------------------------------------------------------------- Doc: quick brown fox jumps over the lazy dog --------------------------------------------------------------------------------------- Query: over fox quick Slop 1: over fox|quick Slop 2: quick|over fox Slop 3: quick over fox Slop 4: quick over|fox Slop 5: quick fox over Slop 6: quick fox over
Total steps 6
So, I reproduced the issue, with the mapping you provided and was able to troubleshoot the issue, with the help of Explain API and this article on slop in match_phrase queries.
So your second query gives result when minimum slop of 6
is given as shown in my search result.
{
"query": {
"match_phrase": {
"title": {
"query": "over fox quick", "slop": 6 --> note 6
}
}
}
}
Similarly, you need to give a minimum slop of 3
to bring the search result from your first query.
Basically slop value means, allowable deviation of the configurable term.
Example:- your doc contains Quick Brown fox jumps over the lazy dog
.
Quick
Brown
fox
jumps
over
the
lazy
dog
And if you are searching for fox quick over
as a phrase, they all need to come together, for that you need to rearrange the tokens mentioned above.
Minimum replacement required is 3 as shown following:
fox
and over
no need to change anything, as they are already in order and quick
needs to make 3 replacement, in order to come to its correct position.
Using the same method you can figure out why six slop is required in your second query to work.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With