前言
本文Elastic Search版本为6.7,将介绍ES的查询的基本概念和用法。
Query 和 Filter
Elastic Search中的搜索有两类,一类是查询(Query),一类是匹配(Filter)。在现实中我们会使用组合查询的方式组合两类查询,并获取相关的文档。
Query和Filter的区别是什么呢?
(1)Filter相当于是一个过滤函数,他只返回true或者false两种结果。他可以用以下伪代码表示
//fn为一种filter函数
fn = Filter(condition)
//使用filter函数接收document返回ture或者false
fn.apply(document) => {ture,flase}
//doc集合使用filter函数过滤符合条件的doc
set<Document>.stream().filter(fn).collect()
如果filter函数返回true,那么表示该document符合条件将会保留下来,否则将会被过滤。一般参与filter计算的是Document中数值相关或者状态值相关的字符串。
(2) Query是一种相关度评分函数,他会根据条件对文档进行评分,评分越高表示该文档的相关度越高。一般会用于文本匹配,或者进阶的自定义函数评分。
我们使用以下伪代码表示(仅用于理解,ES内部的计算过程使用了分词和反向索引,并不是这样的)
//fn是一种相关度query函数
fn = Query(conditon)
//使用fn会计算出document的分数
fn.apply(document) = score
//系统将使用评分函数进行评分,相关度越高的文档排名越前
Set<Document>.stream().map(tuple.of(document,fn.apply(document))).sortBy(Tuple::second).collect()
bool组合查询
在这里将介绍bool查询,bool查询包含四种操作符,分别是must,should,must_not,query。他们均是一种数组,数组里面是对应的判断条件。
- 在must域定义的所有query条件,document都必须都相关才能被召回
- 在filter域定义的所有filter条件,document必须都满足才能被召回
- 在should域定义的所有query条件,document至少有一个匹配到条件才能被召回
- 在must_not定义的所有filter条件,document必须都不满足才能被召回
以下为一个基本的查询例子
POST _search
{
"query": {
"bool" : {
"must" : {
"term" : { "user" : "kimchy" }
},
"filter": {
"term" : { "tag" : "tech" }
},
"must_not" : {
"range" : {
"age" : { "gte" : 10, "lte" : 20 }
}
},
"should" : [
{ "term" : { "tag" : "wow" } },
{ "term" : { "tag" : "elasticsearch" } }
],
"minimum_should_match" : 1,
"boost" : 1.0
}
}
}