这篇文章主要介绍“Elasticsearch基本查询及组合查询实例分析”,在日常操作中,相信很多人在Elasticsearch基本查询及组合查询实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Elasticsearch基本查询及组合查询实例分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
Elasticsearch查询
查询分类:
基本查询:使用es内置查询条件进行查询
组合查询:把多个查询组合在一起进行复合查询
过滤:查询的同时,通过filter条件在不影响打分的情况下筛选数据
一 基本查询
#添加映射PUT lago{ "mappings": { "properties":{ "title":{ "stort":true, "type":"text", "analyzer":"ik_max_word" }, "company_name":{ "stort":true, "type":"keyword", }, "desc":{ "type":"text" }, "comments":{ "type":"integer" }, "add_time":{ "type":"date", "format":"yyy-MM-dd" } } }}#测试数据POST lago/job{ "title":"python django 开发工程师", "company_name":"美团科技有限公司", "desc":"对django熟悉,掌握mysql和非关系型数据库,网站开发", "comments:200, "add_time":"2018-4-1"}POST lago/job{ "title":"python数据分析", "company_name":"百度科技有限公司", "desc":"熟悉python基础语法,熟悉数据分析", "comments:5, "add_time":"2018-10-1"}POST lago/job{ "title":"python自动化运维", "company_name":"上海华为", "desc":"熟悉python基础语法,精通Linux", "comments:90, "add_time":"2019-9-18"}
1.1 match查询
GET lagou/job/_search{ "query":{ "match":{ "title":"python" } }}#因为title字段做了分词,python都能搜索出来#搜索python网站也能搜索出来,把python和网站分成两个词#搜索爬取也能搜索到,把爬和取分词,去搜索#只搜取 搜不到
1.2 term查询
GET lagou/_search{ "query":{ "term":{ "title":"python" } }}#会拿着要查询的词不做任何处理,直接查询#用python爬虫,查不到,用match就能查到{ "query":{ "term":{ "company_name":"美团" } }}#通过美团,就查询不到
1.3 terms查询
GET lagou/_search{ "query":{ "terms":{ "title":["工程师","django","运维"] } }}#三个词,只要有一个,就会查询出来
1.4 控制查询的返回数量(分页)
GET lagou/_search{ "query":{ "match":{ "title":"python" } }, "form":1, "size":2}#从第一条开始,大小为2
1.5 match_all 查询
GET lagou/_search{ "query":{ "match_all":{} }}#所有数据都返回
1.6 match_phrase查询
GET lagou/_search{ "query":{ "match_phrase":{ "title":{ "query":"python系统", "slop":6 } } }}#短语查询, #会把查询条件python和系统分词,放到列表中,再去搜索的时候,必须满足python和系统同时存在的才能搜出来#"slop":6 :python和系统这两个词之间最小的距离
1.7 multi_match
GET lagou/_search{ "query":{ "multy_match":{ "query":"python", "fields":["title","desc"] } }}#可以指定多个字段#比如查询title和desc这个两个字段中包含python关键词的文档#"fields":["title^3","desc"]:权重,title中的python是desc中的三倍
1.8 指定返回的字段
GET lagou/_search{ "query":{ "stored_fields":["title","company_name"] "match":{ "title":"python" } }}#只返回title和company_name字段#"stored_fields":["title","company_name",'dsc'],不会返回dsc,因为我们要求stroed_fields,之前desc字段设为false(默认),不会显示
1.9 sort 结果排序
GET lagou/_search{ "query":{ "match_all":{} }, "sort":[ { "comments":{ "order":"desc" } } ]}#查询所有文档,按comments按desc降序排序
1.10 range范围查询
GET lagou/_search{ "query":{ "range":{ "comments":{ "gte":10, "lte":20, "boost":2.0 } } }}#指定comments字段大于等于10,小于等于20#boost:权重GET lagou/_search{ "query":{ "range":{ "add_time":{ "gte":"2019-10-11", "lte":"now", } } }}#对时间进行查询
1.11 wildcard查询
GET lagou/_search{ "query":{ "wildcard":{ "title":{ "value":"pyth*n", "boost":2.0 } } }}#模糊查询,title中,有pyth任意值n得都能查出来
1.12 exists存在
exists:字段包含,存在的# 包含followers_count字段GET user_toutiao/_search{ "query": { "bool": { "must": [ {"exists": { "field": "followers_count" }} ] } }}# 不包含followers_count字段GET user_toutiao/_count{ "query": { "bool": { "must_not": [ {"exists": { "field": "followers_count" }} ] } }}# 不包含followers_count且updata_timestamp>1614221216GET user_toutiao/_count{ "query": { "bool": { "must_not": [ { "exists": { "field": "followers_count" } } ], "must": [ {"range": { "updata_timestamp": { "gt": 1614221216 } }} ] } }}
二 组合查询
2.1 bool查询
#bool查询包括must should must_not filter'''bool:{"filter":[], 字段过滤"must":[], 所有查询条件都满足"should":[], 满足一个或多个"must_not":{} 都不满足于must相反}'''# 建立测试数据POST lago/testjob/_bulk{"index":{"_id":1}}{"salary":10,"title":"Python"}{"index":{"_id":2}}{"salary":20,"title":"Scrapy"}{"index":{"_id":3}}{"salary":30,"title":"Django"}{"index":{"_id":4}}{"salary":30,"title":"Elasticsearch"}
2.2 简单过滤查询
#select * from testjob where salary=20GET lagou/testjob/_search{ "query":{ "bool":{ "must":{ "match_all":{} }, "filter":{ "term":{ "salary":20 } } } }}
2.3 查询多个值
#查询薪资是10k或20k的GET lagou/testjob/_search{ "query":{ "bool":{ "must":{ "match_all":{} }, "filter":{ "terms":{ "salary":[10,20] } } } }}#select * from testjob where title="python"GET lagou/testjob/_search{ "query":{ "bool":{ "must":{ "match_all":{} }, "filter":{ "term":{ "title":"Python" } } } }}#title 是text字段,会做大小写转换,term不会预处理,拿着大写Python去查查不到#可以改成小写,或者用match来查询''' "filter":{ "match":{ "title":"Python" } }'''#查看分析器解析结果GET _analyze{ "analyzer":"ik_max_word", "text":"python网络开发工程师"}
2.4 bool过滤查询,可以做组合过滤查询
#select * from testjob where (salary=20 or title=Python) and (salary!=30)#查询薪资等于20k或者工作为python的工作,排除价格为30k的{ "query":{ "bool":{ "should":[ {"term":{"salary":20}}, {"term":{"title":"python"}} ], "must_not":{ "term":{"salary":30} } } }}#select * from testjob where title=python or (title=django and salary=30){ "query":{ "bool":{ "should":[ {"term":{"title":"python"}}, { "bool":{ "must":[ {"term":{"title":"django"}}, {"term":{"salary":30}} ] } } ] } }}
到此,关于“Elasticsearch基本查询及组合查询实例分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!