elasticsearch中的span_contain和span_within查询有什么区别?

时间:2018-09-10 14:12:51

标签: elasticsearch lucene search-engine querydsl

文档说

包含span_:

  

big和little子句可以是任何跨度类型查询。匹配范围   来自大的包含来自小的匹配。

span_within:

  

big和little子句可以是任何跨度类型查询。匹配范围   从封闭在大容器中的小容器返回。

1 个答案:

答案 0 :(得分:0)

就查询匹配的文档而言,没有区别。区别在于匹配的跨度。

  • 包含span_big的匹配项。
  • span_within匹配得很少。

查询将从匹配的跨度中获得提升,因此span_ contains将从匹配的跨度中获得提升,而span_within将从匹配的跨度中得到提升。

如果您的span_within或span_ contains是另一个考虑匹配范围的位置的范围查询,则该差异也变得很重要。


例如,假设您有一些文字:

  

Lorem ipsum dolor坐下来,奉献自若。

并且您的span_ contains / within匹配前五个术语,几乎不匹配“ ipsum”。如果再将其包裹在span_near中,则外部span_near的斜率将从span_contain的大边界和span_within的little(“ ipsum”)边界开始。

“ amet”(大号的结尾)与“ consectetur”之间的距离≤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”和“ consectetur”之间的距离大于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
}