es 查询

内容详细

es的查询

0.1 准备数据

# 准备数据 PUT lqz/_doc/1 { "name":"顾老二", "age":30, "from": "gu", "desc": "皮肤黑、武器长、性格直", "tags": ["黑", "长", "直"] } PUT lqz/_doc/2 { "name":"大娘子", "age":18, "from":"sheng", "desc":"肤白貌美,娇憨可爱", "tags":["白", "富","美"] } PUT lqz/_doc/3 { "name":"龙套偏房", "age":22, "from":"gu", "desc":"mmp,没怎么看,不知道怎么形容", "tags":["造数据", "真","难"] } PUT lqz/_doc/4 { "name":"石头", "age":29, "from":"gu", "desc":"粗中有细,狐假虎威", "tags":["粗", "大","猛"] } PUT lqz/_doc/5 { "name":"魏行首", "age":25, "from":"广云台", "desc":"仿佛兮若轻云之蔽月,飘飘兮若流风之回雪,mmp,最后竟然没有嫁给顾老二!", "tags":["闭月","羞花"] }

0.2 match和term

match和term中必须要加条件,但是我们有时候需要查询所有,不带条件,需要用到match_all

0.3match_all

# 查询所有 GET lqz/_search { "query": { "match_all": {} } }

0.4 前缀查询match_phrase_prefix

# 查英文 beautiful --->be开头的---》能查到 GET lqz/_search { "query": { "match_phrase_prefix": { "name": "顾" } } }

0.5 match_phrase

# 会分词,分词完成后,如果写了slop,会按分词之间间隔是slop数字去抽 GET t1/doc/_search { "query": { "match_phrase": { "title": { "query": "中国世界", "slop": 2 } } } }

0.6 多条件查询,或的关系

GET lqz/_search # 只要name或者desc中带龙套就查出来 { "query": { "multi_match": { "query": "龙套", "fields": ["name", "desc"] } } }

1 Elasticsearch之排序查询

# 结构化查询 GET lqz/_search { "query": { "match": { "name": "" } } } # 排序查询---》可以按多个排序条件-->sort的列表中继续加 GET lqz/_search { "query": { "match": { "from": "gu" } }, "sort": [ { "age": { "order": "asc" } } ] } # 不是所有字段都可以排序--->只能是数字字段

2 Elasticsearch之分页查询

# from 和size GET lqz/_search { "query": { "match_all": {} }, "sort": [ { "age": { "order": "desc" } } ], "from": 3, "size": 2 }

3 Elasticsearch之布尔查询

# must(and) should(or) must_not(not) filter # must条件 and条件 GET lqz/_search { "query": { "bool": { "must": [ { "match": { "from": "sheng" } }, { "match": { "age": 18 } } ] } } } # 咱们认为的and查询,但是不行 GET lqz/_search { "query": { "match": { "from": "sheng", "age":18 } } } # 查询课程标题或者课程介绍中带python的数据 # shoud or 条件---》搜索框,就是用它 GET lqz/_search { "query": { "bool": { "should": [ { "match": { "from": "sheng" } }, { "match": { "age": 22 } } ] } } } # must_not 既不是也不是 GET lqz/_search { "query": { "bool": { "must_not": [ { "match": { "from": "gu" } }, { "match": { "tags": "可爱" } }, { "match": { "age": 18 } } ] } } } # 查询from为gu,age大于25的数据怎么查 GET lqz/_search { "query": { "bool": { "must": [ { "match": { "from": "gu" } } ], "filter": { "range": { "age": { "lt": 25 } } } } } }

4 Elasticsearch之查询结果过滤

# 只查某几个字段 GET lqz/_search { "query": { "match": { "name": "顾老二" } }, "_source": ["name", "age"] }

5 Elasticsearch之高亮查询

# 默认高亮 GET lqz/_search { "query": { "match": { "name": "石头" } }, "highlight": { "fields": { "name": {} } } } # 自定义高亮 GET lqz/_search { "query": { "match": { "from": "gu" } }, "highlight": { "pre_tags": "<b class='key' style='color:red'>", "post_tags": "</b>", "fields": { "from": {} } } }

6 Elasticsearch之聚合函数

# avg max min sum # avg GET lqz/_search { "query": { "match": { "from": "gu" } }, "aggs": { "my_avg": { "avg": { "field": "age" } } }, "_source": ["name", "age"] }

7 Python操作es

# 如果官方没提供,使用requests模块,发送http请求即可 ''' PUT lqz/_doc/2 { "name":"大娘子", "age":18, "from":"sheng", "desc":"肤白貌美,娇憨可爱", "tags":["白", "富","美"] } ''' # # import requests # # data = { # "name": "大娘子", # "age": 18, # "from": "sheng", # "desc": "肤白貌美,娇憨可爱", # "tags": ["白", "富", "美"] # } # res=requests.put('http://127.0.0.1:9200/lqz/_doc/6', json=data) # print(res.text) # 查询 # 官方提供了python操作es包,基础包--》建议你用---》类似于pymysql # pip install elasticsearch from elasticsearch import Elasticsearch # Instantiate a client instance client = Elasticsearch("http://localhost:9200") # Call an API, in this example `info()` # resp = client.info() # print(resp) # 创建索引(Index) # result = client.indices.create(index='user') # print(result) # 删除索引 # result = client.indices.delete(index='user') # 插入数据 # data = {'userid': '1', 'username': 'lqz','password':'123'} # result = client.create(index='news', doc_type='_doc', id=1, body=data) # print(result) # 更新数据 ''' 不用doc包裹会报错 ActionRequestValidationException[Validation Failed: 1: script or doc is missing ''' # data ={'doc':{'userid': '1', 'username': 'lqz','password':'123ee','test':'test'}} # result = client.update(index='news', doc_type='_doc', body=data, id=1) # print(result) # 删除数据 # result = client.delete(index='news',id=1) # 查询 # 查找所有文档 # query = {'query': {'match_all': {}}} # # 查找名字叫做jack的所有文档 # query = {'query': {'term': {'username': 'lqz'}}} # 查找年龄大于11的所有文档 query = {'query': {'range': {'age': {'gt': 28}}}} allDoc = client.search(index='lqz', body=query) # print(allDoc['hits']['hits'][0]['_source']) print(allDoc) # python操作es的包---》类似于django的orm包 # 用的最多的是查询 # 写个脚本,把课程表的数据,同步到es中(建立索引---》插入数据)
# High level Python client for Elasticsearch # https://github.com/elastic/elasticsearch-dsl-py from datetime import datetime from elasticsearch_dsl import Document, Date, Nested, Boolean,analyzer, InnerDoc, Completion, Keyword, Text,Integer from elasticsearch_dsl.connections import connections connections.create_connection(hosts=["localhost"]) class Article(Document): title = Text(fields={'title': Keyword()}) author = Text() class Index: name = 'myindex' # 索引名 if __name__ == '__main__': # Article.init() # 创建映射 # 保存数据 # article = Article() # article.title = "测试测试" # article.author = "刘清政" # article.save() # 数据就保存了 #查询数据 # s=Article.search() # s = s.filter('match', title="测试") # results = s.execute() # print(results) #删除数据 # s = Article.search() # s = s.filter('match', title="测试").delete() #修改数据 s = Article().search() s = s.filter('match', title="测试") results = s.execute() print(results[0]) results[0].title="xxx" results[0].save()
# es数据和mysql数据同步 -方案一:第三方同步脚本,实时同步mysql和es数据,软件运行,配置一下就可以了,后台一直运行 -https://github.com/go-mysql-org/go-mysql-elasticsearch -编译成可执行文件,启动就行----》linux上编译,go sdk---》跨平台编译 -方案二:(简历里说---》es和mysql的同步工具) -自己用python写---》三个表,pymysql---》es中---》后台一直运行 -三个表,删除数据呢?公司里的数据都不删,都是软删除 -三个表增加---》记录每个表同步到的位置id号---》 -pymysql es -免费课表(id,name,price),实战课表(id,name,price,teacher) id_1=0 id_2=0 pymyql打开免费课,查询id如果大于id_1,把大于id_1的取出来组装成字典,存入es pymyql打开实战课,查询id如果大于id_2,把大于id_2的取出来,存入es -同步到es中---》es中只存id,name,price -方案三:使用celery,只要mysql相应的表里插入一条数据,就使用celery的异步,把这条记录插入到es中去 -方案三:信号---》监控到哪个表发生了变化---》只要xx表发生变化,就插入es

__EOF__

本文作者向上
本文链接https://www.cnblogs.com/ydy001/p/16352387.html
关于博主:没有收拾残局的能力,就别放纵善变的情绪
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   风花雪月*  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示