В чем разница между запросом span_contain и span_within в elasticsearch?

В документации говорится

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.

1
0
482
1

Ответы 1

Насколько документы соответствуют запросу, разницы нет. Разница в том, какой диапазон совпадает.

  • span_contain соответствует большим.
  • span_within мало соответствует.

Запрос получит усиление от соответствующего диапазона, поэтому 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
}

Другие вопросы по теме