最近两天一直在学习 ES 的相关内容。
入门级别;
学习途径:主要是官方文档
这篇文章主要关注使用ES做查询
# # 在我的理解看来,查询有不同的分类形式
第一种分类:基本查询和组合查询
第二种分类:打分查询和不打分查询
这个分类只代表我自己的理解。其实不管怎么分类就是查询,就看我们怎么理解,怎么去使用它的特性,去解决问题。
# # 先来将一下 ES 的查询 和 我之前学的SQL查询
之前习惯使用关系型数据库,所以写查询语句都是: select * from tablename where cloumname="..";
而在ES 中叫做 DSL(查询表达式),在我的理解看来,其实没什么变化,查询语句还是查询语句,只不过变了一种写法而已,DSL就是一种JSON 格式罢了。不信来看一下:
这里做一个简单的映射,并不是绝对的说 match 就是 where
# # 再来看一下我前边提到的分类,基本查询
所谓的节本查询,其实就是一些查询条件
match 查询 ,这个相当于是 sql 中的 where 并且加模糊的条件 例如:select * from table where name like"张%"
这个在es 中的例子,就是上边的图片。
range 查询 ,这个相当于是 sql 中的 where 后边跟着一个范围查询 例如 select * from table where age>20 and age<30
这个在es 中的查询语句,就是写成了json格式:
term 查询,这个相当于是 sql 中的 where 并且加精确的条件,例如 select * from table where age = 26
在es中的查询语句就是:
terms 查询,这个相当于是 sql 中的 where 并且in的条件,例如: select * from table where tag in(search,full_text,nosql)
而在es中
exists 和 missing 查询 这与SQL中的 IS_NULL
(missing
) 和 NOT IS_NULL
(exists
) 在本质上具有共性,例如 select * from table where title not IS_NULL
# # 再来看一下我前边提到的分类,组合查询
这个其实就是,将一些条件进行组合,举个例子,select * from table where name="张三" and age in(15,20,30)
而在es 里边又是另外一种形式,同时ES 对这些查询进行了增强,我们应该知道ES是可以做相关性查询的,这是和关系数据库最大的区别,也是ES最大的优点之一。所以对查询做了增强。
在ES 中增加了这些字段:
must : 必须包含查询内容
must_not :必须不包含查询内容
should:最好包含查询内容,包含的越多,得分越多,这个得分和打分查询有关系
filter : 必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献。
来看一下ES的组合查询的语句是怎么写的:
{
"bool": {
"must": { "match": { "title": "how to make millions" }},
"must_not": { "match": { "tag": "spam" }},
"should": [
{ "match": { "tag": "starred" }}
],
"filter": {
"range": { "date": { "gte": "2014-01-01" }}
}
}
}
这一块具体介绍,还是看下官方文档:https://www.elastic.co/guide/cn/elasticsearch/guide/current/combining-queries-together.html
# # 打分查询和不打分查询
对于打分不打分这个问题,最主要的还是性能的影响,说白了,不打分查询要比打分查询的性能更好一点。并且对于一些精确查询,其实是完全没有必要打分的。将查询条件移到 filter
语句中,我们将它转成不评分的查询,将不再影响文档的相关性排名。由于它现在是一个不评分的查询,可以使用各种对 filter 查询有效的优化手段来提升性能。
对于打不打分,filter 这个关键字很重要。对于一个组合查询,如果不想打分,则将查询的条件放进 filter 里边即可。