elasticsearchdsl查询
接续上篇,本篇使用python的elasticsearch-dsl库操作elasticsearch进行查询。
7.查询
Elasticsearch是功能非常强大的搜索引擎,使用它的目的就是为了快速的查询到需要的数据。
查询分类:
- 基本查询:使用es内置查询条件进行查询
- 组合查询:把多个查询组合在一起进行复合查询
- 过滤:查询同时,通过filter条件在不影响打分的情况下筛选数据
7.1、基本查询
- 查询前先创建一张表
1PUT chaxun
2{
3"mappings": {
4"job":{
5"properties": {
6"title":{
7"store": true,
8"type": "text",
9"analyzer": "ik_max_word"
10 },
11"company_name":{
12"store": true,
13"type": "keyword"
14 },
15"desc":{
16"type": "text"
17 },
18"comments":{
19"type":"integer"
20 },
21"add_time":{
22"type":"date",
23"format": "yyyy-MM-dd"
24 }
25 }
26 }
27 }
28 }
表截图:
- 查询前先创建一张表
- match查询
1 GET chaxun/job/_search
2{
3"query": {
4"match": {
5"title": "python"
6 }
7 }
8 }
1 s = Search(index='chaxun').query('match', title='python')
2 response = s.execute()
- term查询
term查询不会对查询条件进行解析(分词)
1 GET chaxun/job/_search
2{
3"query": {
4"term":{
5"title":"python爬虫"
6 }
7 }
8 }
1 s = Search(index='chaxun').query('term', title='python爬虫')
2 response = s.execute()
- terms查询
1 GET chaxun/job/_search
2{
3"query": {
4"terms":{
5"title":["工程师", "django", "系统"]
6 }
7 }
8 }
1 s = Search(index='chaxun').query('terms', title=['django', u'工程师', u'系统'])
2 response = s.execute()
- 控制查询的返回数量
1 GET chaxun/job/_search
2{
3"query": {
4"term":{
5"title":"python"
6 }
7 },
8"from":1,
9"size":2
10 }
1 s = Search(index='chaxun').query('terms', title=['django', u'工程师', u'系统'])[0:2]
2 response = s.execute()
- match_all 查询所有
1 GET chaxun/job/_search
2{
3"query": {
4"match_all": {}
5 }
6 }
1 s = Search(index='chaxun').query('match_all')
2 response = s.execute()
- match_phrase短语查询
1 GET chaxun/job/_search
2{
3"query": {
4"match_phrase": {
5"title": {
6"query": "python系统",
7"slop": 3
8 }
9 }
10 }
11 }
1 s = Search(index='chaxun').query('match_phrase', title={"query": u"elasticsearch引擎", "slop": 3})
2 response = s.execute()
注释:将查询条件“python系统”分词成[“python”, “系统”],结果需同时满足列表中分词短语,“slop”指定分词词距,匹配结果需不超过slop,比如“python打造推荐引擎系统”,如果slop小于6则无法匹配。
- multi_match查询
1 GET chaxun/job/_search
2{
3"query": {
4"multi_match": {
5"query": "python",
6"fields": ["title^3", "desc"]
7 }
8 }
9 }
1 q = Q('multi_match', query="python", fields=["title", "desc"])
2 s = Search(index='chaxun').query(q)
3 response = s.execute()
注释:指定查询多个字段,”^3”指定”title”权重是”desc”的3倍。
- 指定返回字段
1 GET chaxun/job/_search
2{
3"stored_fields": ["title", "company_name"],
4"query": {
5"match": {
6"title": "python"
7 }
8 }
9 }
1 s = Search(index='chaxun').query('match', title='python').source(['title', 'company_name'])
2 response = s.execute()
- 通过sort对结果排序
1 GET chaxun/job/_search
2{
3"query": {
4"match_all": {}
5 },
6"sort": [
7 {
8"comments": {
9"order": "desc"
10 }
11 }
12 ]
13 }
1 s = Search(index='chaxun').query('match_all').sort({"comments": {"order": "desc"}})
2 response = s.execute()
- range查询范围
1 GET chaxun/job/_search
2{
3"query": {
4"range": {
5"comments": {
6"gte": 10,
7"lte": 50,
8"boost": 2.0 --权重
9 }
10 }
11 }
12 }
1 s = Search(index='chaxun').query('range', comments={"gte": 10, "lte": 50, "boost": 2.0})
2 response = s.execute()
- wildcard查询
1 GET chaxun/job/_search
2{
3"query": {
4"wildcard": {
5"title": {
6"value": "pyth*n",
7"boost": 2
8 }
9 }
10 }
11 }
1 s = Search(index='chaxun').query('wildcard', title={"value": "pyth*n", "boost": 2})
2 response = s.execute()
- match查询
7.2、组合查询
- 新建一张查询表
- bool查询
- 格式如下
1bool:{
2"filter":[],
3"must":[],
4"should":[],
5"must_not":[]
6 }
- 最简单的filter查询
1select*from testdb where salary=20
1 GET bool/testdb/_search
2{
3"query": {
4"bool": {
5"must": {
6"match_all":{}
7 },
8"filter": {
9"term":{
10"salary":20
11 }
12 }
13 }
14 }
15 }
1 s = Search(index='bool').query('bool', filter=[Q('term', salary=20)])
2 response = s.execute()
- 查看分析器解析(分词)的结果
1GET _analyze
2{
3"analyzer": "ik_max_word",
4"text": "成都电子科技大学"
5 }
注释:”ik_max_word”,精细分词;”ik_smart”,粗略分词
- bool组合过滤查询
1select*from testdb where (salary=20or title=python) and (salary !=30)
1 GET bool/testdb/_search
2{
3"query": {
4"bool": {
5"should": [
6 {"term":{"salary":20}},
7 {"term":{"title":"python"}}
8 ],
9"must_not": [
10 {"term":{"salary":30}}
11 ]
12 }
13 }
14 }
1 q = Q('bool', should=[Q('term', salary=20), Q('term', title='python')],must_not=[Q('term', salary=30)])
2 response = s.execute()
- 嵌套查询
1select*from testdb where title=python or (title=django and salary=30)
1 GET bool/testdb/_search
2{
3"query": {
4"bool":{
5"should":[
6 {"term":{"title":"python"}},
7 {"bool":{
8"must":[{"term":{"title":"django"}},
9 {"term":{"salary":30}}]
10 }}
11 ]
12 }
13 }
14 }
1 q = Q('bool', should=[Q('term', title='python'), Q('bool', must=[Q('term', title='django'), Q('term', salary=30)])])
2 s = Search(index='bool').query(q)
3 response = s.execute()
- 过滤空和非空
- 最简单的filter查询
- 建立测试数据
1 POST null/testdb2/_bulk
2 {"index":{"_id":1}}
3 {"tags":["search"]}
4 {"index":{"_id":2}}
5 {"tags":["search", "python"]}
6 {"index":{"_id":3}}
7 {"other_field":["some data"]}
8 {"index":{"_id":4}}
9 {"tags":null}
10 {"index":{"_id":5}}
11 {"tags":["search", null]}
- 处理null空值的方法
1select tags from testdb2 where tags isnotNULL
1 GET null/testdb2/_search
2{
3"query": {
4"bool":{
5"filter": {
6"exists": {
7"field": "tags"
8 }
9 }
10 }
11 }
12 }
1 s = Search(index='null').query('bool', filter={"exists": {"field": "tags"}})
2 response = s.execute()
7.3、聚合查询
未完待续...
以上是 elasticsearchdsl查询 的全部内容, 来源链接: utcz.com/z/509936.html