Skip to main content

跨度匹配 span

Span Queries

跨度查询是 low-level 的位置查询,它提供对指定关键词的顺序和接近度的专门控制。

Span Term Queries

span_term 提供基础span query ,通常和其他span查询组合使用。

GET /_search
{
"query": {
"span_term" : { "user" : "kimchy" }
}
}

Span Multi Term Queries

span_multi 查询允许您将多术语查询(通配符、模糊、前缀、范围或正则表达式查询之一)包装为跨度查询,因此它可以嵌套。例子:

GET /_search
{
"query": {
"span_multi":{
"match":{
"prefix" : { "user" : { "value" : "ki" } }
}
}
}
}

Span First Query

匹配字段开头附近的跨度。这是一个例子:

GET /_search
{
"query": {
"span_first" : {
"match" : {
"span_term" : { "user" : "kimchy" }
},
"end" : 3
}
}
}

match 子句可以是任何其他 span query。 end 控制match中允许的最大结束位置。

Span Near Query

匹配彼此靠近的跨度。可以指定 slop,中间不匹配位置的最大数量,以及匹配是否需要按顺序进行。 这是一个例子:

{
"query": {
"span_near" : {
"clauses" : [
{ "span_term" : { "field" : "value1" } },
{ "span_term" : { "field" : "value2" } },
{ "span_term" : { "field" : "value3" } }
],
"slop" : 12,
"in_order" : false
}
}
}

clauses 是一个或多个其他 span 类型查询的列表,slop 控制允许的中间不匹配位置的最大数量。

Span Or Query

匹配其跨度子句的并集 这是一个例子:

GET /_search
{
"query": {
"span_or" : {
"clauses" : [
{ "span_term" : { "field" : "value1" } },
{ "span_term" : { "field" : "value2" } },
{ "span_term" : { "field" : "value3" } }
]
}
}
}

Span Not Query

删除与另一个SpanQuery重叠的匹配项,或在另一个SpanQuery之前(由参数pre控制)x标记内或之后(由参数post控制)y标记内的匹配项。span not查询映射到Lucene SpanNotQuery。下面是一个示例:

GET /_search
{
"query": {
"span_not" : {
"include" : {
"span_term" : { "field1" : "hoya" }
},
"exclude" : {
"span_near" : {
"clauses" : [
{ "span_term" : { "field1" : "la" } },
{ "span_term" : { "field1" : "hoya" } }
],
"slop" : 0,
"in_order" : true
}
}
}
}
}

include 和 exclude 子句可以是任何跨度类型的查询。 include 子句是匹配被过滤的span 查询,exclude 子句是匹配不能与返回的重叠的span 查询。

在上面的示例中,除了前面有 la 的文档外,所有包含术语 hoya 的文档都被过滤掉了。

参数选项:

参数含义
pre如果设置包含范围之前的令牌数量,则不能与排除范围重叠。默认值为0。
post如果设置包含范围之后的令牌数量,则不能与排除范围重叠。默认值为0。
dist如果设置,则包含范围内的令牌数量不能与排除范围重叠。相当于设置前后。

Span Containing Query

返回包含另一个span查询的匹配项。包含查询的span映射到Lucene SpanContainingQuery。下面是一个示例

GET /_search
{
"query": {
"span_containing" : {
"little" : {
"span_term" : { "field1" : "foo" }
},
"big" : {
"span_near" : {
"clauses" : [
{ "span_term" : { "field1" : "bar" } },
{ "span_term" : { "field1" : "baz" } }
],
"slop" : 5,
"in_order" : true
}
}
}
}
}

big和little子句可以是任何跨度类型的查询。返回从大到小的匹配跨度。

Span Within Query

返回包含在另一个span查询中的匹配项。查询中的span映射到Lucene SpanWithinQuery。下面是一个示例:

GET /_search
{
"query": {
"span_within" : {
"little" : {
"span_term" : { "field1" : "foo" }
},
"big" : {
"span_near" : {
"clauses" : [
{ "span_term" : { "field1" : "bar" } },
{ "span_term" : { "field1" : "baz" } }
],
"slop" : 5,
"in_order" : true
}
}
}
}
}

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

Span Field Masking Query

Wrapper允许span查询通过隐藏其搜索字段来参与复合单字段span查询。span字段掩码查询映射到Lucene的SpanFieldMaskingQuery。这可用于支持span near或span或跨不同字段的查询,这通常是不允许的。 当使用多个分析器对同一内容进行索引时,跨度字段屏蔽查询与多字段结合使用非常有用。例如,我们可以用标准分析器将文本分解为单词,然后用英语分析器将单词词根形式。

例子

GET /_search
{
"query": {
"span_near": {
"clauses": [
{
"span_term": {
"text": "quick brown"
}
},
{
"field_masking_span": {
"query": {
"span_term": {
"text.stems": "fox"
}
},
"field": "text"
}
}
],
"slop": 5,
"in_order": false
}
}
}
tip

注意:当span字段掩码查询返回掩码字段时,将使用提供的字段名称规范进行评分。这可能会导致意外的得分行为。