Elasticsearch Span Query跨度查询

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

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

span_term查询

这个查询若是单独使用,效果跟term查询差很少,可是通常仍是用于其余的span查询的子查询。翻译

用法也很简单,只须要指定查询的字段便可:code

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

另外,还能够指定查询出的分值倍数:regexp

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

span_multi查询

span_multi能够包装一个multi_term查询,好比wildcard,fuzzy,prefix,term,range或者regexp等等,把他们包装起来当作一个span查询。htm

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

{ "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。

相关文章
相关标签/搜索