В документации говорится
span_contain:
The big and little clauses can be any span type query. Matching spans from big that contain matches from little are returned.
span_within:
The big and little clauses can be any span type query. Matching spans from little that are enclosed within big are returned.
Насколько документы соответствуют запросу, разницы нет. Разница в том, какой диапазон совпадает.
Запрос получит усиление от соответствующего диапазона, поэтому span_contain получит его от большого, а span_within получит его от совпадающего маленького.
Разница также становится актуальной, если ваш span_within или span_contain является частью другого запроса диапазона, который учитывает положение совпадающего диапазона.
Например, допустим, у вас есть текст:
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
И ваш span_contain / inside соответствует первым пяти терминам с небольшим совпадением «ipsum». Если вы затем оберните его в span_near, тогда наклон этого внешнего span_near будет взят из границ big для span_contain и из маленьких («ipsum») для span_within.
Расстояние между «amet» (конец большого) и «consctetur» ≤1, поэтому это будет соответствовать текст:
"span_near": {
"clauses": [
"span_containing" : {
"little" : {
"span_term" : { "field" : "ipsum" }
},
"big" : {
"span_near" : {
"clauses" : [
{ "span_term" : { "field" : "lorem" } },
{ "span_term" : { "field" : "amet" } }
],
"slop" : 5,
"in_order" : true
}
}
},
{ "span_term" : { "field" : "consectetur" } }
],
"slop": 1,
"in_order": true
}
Но расстояние между «ipsum» и «conctetur»> 1, поэтому это не будет:
"span_near": {
"clauses": [
"span_within" : {
"little" : {
"span_term" : { "field" : "ipsum" }
},
"big" : {
"span_near" : {
"clauses" : [
{ "span_term" : { "field" : "lorem" } },
{ "span_term" : { "field" : "amet" } }
],
"slop" : 5,
"in_order" : true
}
}
},
{ "span_term" : { "field" : "consectetur" } }
],
"slop": 1,
"in_order": true
}