详解 es span query

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限制

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。