Elasticsearch Span Query跨度查询

本文详细介绍了Elasticsearch中SpanQuery的使用方法,包括span_term、span_multi、span_first、span_near、span_or、span_not、span_containing和span_within等查询方式,展示了如何精确控制文本搜索范围和匹配条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ES基于Lucene开发,因此也继承了Lucene的一些多样化的查询,比如本篇说的Span Query跨度查询,就是基于Lucene中的SpanTermQuery以及其他的Query封装出的DSL,接下来就看一下这些DSL都如何使用吧!

更多翻译参考:Elasticsearch知识汇总

span_term查询

这个查询如果单独使用,效果跟term查询差不多,但是一般还是用于其他的span查询的子查询。

用法也很简单,只需要指定查询的字段即可:

{
    "span_term" : { "user" : "kimchy" }
}

另外,还可以指定查询出的分值倍数:

{
    "span_term" : { "user" : { "value" : "kimchy", "boost" : 2.0 } }
}

span_multi查询

span_multi可以包装一个multi_term查询,比如wildcard,fuzzy,prefix,term,range或者regexp等等,把他们包装起来当做一个span查询。

用法也比较简单,内部嵌套一个普通的multi_term查询就行了:

{
    "span_multi":{
        "match":{
            "prefix" : { "user" :  { "value" : "ki" } }
        }
    }
}

也可以使用boost乘以分值,以改变查询结果的分数:

{
    "span_multi":{
        "match":{
            "prefix" : { "user" :  { "value" : "ki", "boost" : 1.08 } }
        }
    }
}

span_first查询

这个查询用于确定一个单词相对于起始位置的偏移位置,举个例子:

如果一个文档字段的内容是:“hello,my name is tom”,我们要检索tom,那么它的span_first最小应该是5,否则就查找不到。

使用的时候,只是比span_term多了一个end界定而已:

{
    "span_first" : {
        "match" : {
            "span_term" : { "user" : "kimchy" }
        },
        "end" : 3
    }
}

span_near查询

这个查询主要用于确定几个span_term之间的距离,通常用于检索某些相邻的单词,避免在全局跨字段检索而干扰最终的结果。

查询主要由两部分组成,一部分是嵌套的子span查询,另一部分就是他们之间的最大的跨度

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

上面的例子中,value1,value2,value3最长的跨度不能超过12.

span_or查询

这个查询会嵌套一些子查询,子查询之间的逻辑关系为 或

{
    "span_or" : {
        "clauses" : [
            { "span_term" : { "field" : "value1" } },
            { "span_term" : { "field" : "value2" } },
            { "span_term" : { "field" : "value3" } }
        ]
    }
}

span_not查询

这个查询相对于span_or来说,就是排除的意思。不过它内部有几个属性,include用于定义包含的span查询;exclude用于定义排除的span查询

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

span_containing查询

这个查询内部会有多个子查询,但是会设定某个子查询优先级更高,作用更大,通过关键字little和big来指定。

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

span_within查询

这个查询与span_containing查询作用差不多,不过span_containing是基于lucene中的SpanContainingQuery,而span_within则是基于SpanWithinQuery。

转载于:https://my.oschina.net/u/204616/blog/545032

<think>好的,用户想了解关于es span_containing的简单示例。首先,我需要确认“es”指的是Elasticsearch,对吗?是的,通常在技术文档中,esElasticsearch的缩写。 接下来,用户提到的“span_containing”查询。我需要回忆一下Elasticsearch中的span查询Span查询属于跨度查询,用于处理文本中词语的位置关系,比如短语、邻近查询等。span_containing是其中一种,用来查找包含另一个span查询结果的span查询。 用户需要简单示例,所以需要构造一个具体的案例。可能的结构是,有两个span查询,一个作为“大”的范围,另一个作为“小”的范围,span_containing会找出包含小范围的大范围结果。 比如,假设有一个包含“quick brown fox jumps over the lazy dog”的文档,想要找到包含“brown fox”并且其中还包含“jumps”的情况。可能需要使用span_near组合“brown”和“fox”,然后span_containing来确保这个组合中包含“jumps”。 不过,需要确认语法是否正确。Elasticsearchspan_containing需要指定little和big两个参数,分别对应内部和外部的span查询。例如,big是一个span_near查询,而little是另一个span_term查询。 需要注意字段是否存在对应的分析器,比如是否保留位置信息,因为span查询依赖于term的位置。确保示例中的字段是text类型,并且使用了合适的分析器,比如标准分析器。 然后,给出一个具体的查询示例,展示如何组合span_containing。可能需要先创建索引,插入示例文档,再执行查询。但用户可能只需要查询的结构,所以可以简化步骤,直接写出查询DSL。 最后,解释示例中的各个部分,说明big和little的作用,以及返回结果的情况。确保用户能理解每个参数的意义,以及如何根据需求调整查询条件。 总结步骤:解释span_containing的作用,给出DSL示例,解释参数,说明示例的结果。确保语言简洁,结构清晰,符合用户要求的中文回答。</think>Elasticsearch 中的 `span_containing` 是一种跨度查询Span Query),用于查找包含其他子跨度查询结果的跨度范围。它类似于容器关系,要求外层跨度(`big`)必须完整包含内层跨度(`little`)。 以下是一个简单示例: ### 示例场景 假设文档内容为: ``` "text": "quick brown fox jumps over the lazy dog" ``` 我们希望找到同时满足以下条件的跨度: 1. 包含短语 `brown fox`(外层跨度) 2. 且外层跨度内必须包含单词 `jumps`(内层跨度) ### Elasticsearch 查询 ```json GET /your_index/_search { "query": { "span_containing": { "big": { "span_near": { "clauses": [ { "span_term": { "text": "brown" } }, { "span_term": { "text": "fox" } } ], "slop": 0, "in_order": true } }, "little": { "span_term": { "text": "jumps" } } } } } ``` ### 关键参数解释 1. **`big`**:定义外层跨度查询 - 使用 `span_near` 组合 `brown` 和 `fox` 为短语(`slop=0` 且 `in_order=true` 表示精确匹配短语) 2. **`little`**:定义内层跨度查询 - 使用 `span_term` 匹配单词 `jumps` ### 结果说明 只有当 `brown fox` 构成的跨度范围内包含 `jumps` 时,文档才会被命中。例如: - 若文本为 `"brown fox jumps"` → 匹配成功 - 若文本为 `"brown fox sleeps"` → 匹配失败 ### 典型应用场景 - 法律条文:查找包含某个条款(外层)且条款内包含特定关键词(内层)的段落 - 日志分析:定位包含错误代码(外层)且包含时间戳(内层)的日志块 注意:跨度查询依赖于分词后的词项位置,需确保字段使用保留位置信息的分析器(如 `standard`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值