span query 指的是es的区间查询,通过该语句用户可以精准控制多个输入词的先后顺序,以及多个关键词在文档中的前后距离
span term
与普通的term检索类似,用来获取某个字段包含特定term的文档。
{
"query": {
"span_term" : { "user" : "kimchy" }
}
}
支持boost提权
{
"query": {
"span_term" : { "user" : { "value" : "kimchy", "boost" : 2.0 } }
}
}
span multi term
允许用户封装一个 multi term query 进行span query的嵌套查询,目前支持 wildcard, fuzzy, prefix, range or regexp query
{
"query": {
"span_multi":{
"match":{
"prefix" : { "user" : { "value" : "ki", "boost" : 1.08 } }
}
}
}
}
span first
从文档开始位置至end结束位置进行关键词查找,当end设置为1时,那么关键词必须匹配在文档开头。
{
"query": {
"span_first" : {
"match" : {
"span_term" : { "user" : "kimchy" }
},
"end" : 3
}
}
}
其中match查询子句可以是任意的span query
span near
span near可以用来对多个关键词进行顺序查找:
{
"query": {
"span_near" : {
"clauses" : [
{ "span_term" : { "field" : "value1" } },
{ "span_term" : { "field" : "value2" } },
{ "span_term" : { "field" : "value3" } }
],
"slop" : 4,
"in_order" : true
}
}
}
其中in_order需要设置为true,value2必须出现在value1和value3直接,且后一个关键词的start_offset减去前一个end_offset的值必须小于等于slop
span or
可以指定多个查询子句,每种查询返回的数据进行合并处理
{
"query": {
"span_or" : {
"clauses" : [
{ "span_term" : { "field" : "value1" } },
{ "span_term" : { "field" : "value2" } },
{ "span_term" : { "field" : "value3" } }
]
}
}
}
查询子句可以更换为任意的span query
span not
该查询有点类似于bool query中的must与must not
{
"query": {
"span_not" : {
"include" : {
"span_term" : { "field1" : "蔬菜" }
},
"exclude" : {
"span_near" : {
"clauses" : [
{ "span_term" : { "field1" : "苹果" } },
{ "span_term" : { "field1" : "手机" } }
],
"slop" : 0,
"in_order" : true
}
}
}
}
}
span containing
span containing与span within用法相同,只是底层调用的Lucene方法不同而已,效果是一样的
{
"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
}
}
}
}
}
通过查询效果 可以发现与span near大致相同,但不同的是little部分不受big中slop限制
网友评论