技术博客: https://github.com/yongxinz/tech-blog

同时,也欢迎关注我的微信公众号 AlwaysBeta,更多精彩内容等你来。

Elasticsearch 基本概念

Index:Elasticsearch用来存储数据的逻辑区域,它类似于关系型数据库中的database 概念。一个index可以在一个或者多个shard上面,同时一个shard也可能会有多个replicas。

Document:Elasticsearch里面存储的实体数据,类似于关系数据中一个table里面的一行数据。

document由多个field组成,不同的document里面同名的field一定具有相同的类型。document里面field可以重复出现,也就是一个field会有多个值,即multivalued。

Document type:为了查询需要,一个index可能会有多种document,也就是document type. 它类似于关系型数据库中的 table 概念。但需要注意,不同document里面同名的field一定要是相同类型的。

Mapping:它类似于关系型数据库中的 schema 定义概念。存储field的相关映射信息,不同document type会有不同的mapping。

Python Elasticsearch DSL 使用简介

连接 Es:

import elasticsearches = elasticsearch.Elasticsearch([{'host': '127.0.0.1', 'port': 9200}])

先看一下搜索,q 是指搜索内容,空格对 q 查询结果没有影响,size 指定个数,from_ 指定起始位置,filter_path 可以指定需要显示的数据,如本例中显示在最后的结果中的只有 _id 和 _type。

res_3 = es.search(index="bank", q="Holmes", size=1, from_=1)res_4 = es.search(index="bank", q=" 39225    5686 ", size=1000, filter_path=['hits.hits._id', 'hits.hits._type'])

查询指定索引的所有数据:

其中,index 指定索引,字符串表示一个索引;列表表示多个索引,如 index=["bank", "banner", "country"];正则形式表示符合条件的多个索引,如 index=["apple*"],表示以 apple 开头的全部索引。

search 中同样可以指定具体 doc-type。

from elasticsearch_dsl import Searchs = Search(using=es, index="index-test").execute()print s.to_dict()

根据某个字段查询,可以多个查询条件叠加:

s = Search(using=es, index="index-test").query("match", sip="192.168.1.1")s = s.query("match", dip="192.168.1.2")s = s.excute()

多字段查询:

from elasticsearch_dsl.query import MultiMatch, Matchmulti_match = MultiMatch(query='hello', fields=['title', 'content'])s = Search(using=es, index="index-test").query(multi_match)s = s.execute()print s.to_dict()

还可以用 Q() 对象进行多字段查询,fields 是一个列表,query 为所要查询的值。

from elasticsearch_dsl import Qq = Q("multi_match", query="hello", fields=['title', 'content'])s = s.query(q).execute()print s.to_dict()

Q() 第一个参数是查询方法,还可以是 bool。

q = Q('bool', must=[Q('match', ), Q('match', content='world')])s = s.query(q).execute()print s.to_dict()

通过 Q() 进行组合查询,相当于上面查询的另一种写法。

q = Q("match", ) | Q("match", )s = s.query(q).execute()print(s.to_dict())# {"bool": {"should": [...]}}q = Q("match", ) & Q("match", )s = s.query(q).execute()print(s.to_dict())# {"bool": {"must": [...]}}q = ~Q("match", )s = s.query(q).execute()print(s.to_dict())# {"bool": {"must_not": [...]}}

过滤,在此为范围过滤,range 是方法,timestamp 是所要查询的 field 名字,gte 为大于等于,lt 为小于,根据需要设定即可。

关于 term 和 match 的区别,term 是精确匹配,match 会模糊化,会进行分词,返回匹配度分数,(term 如果查询小写字母的字符串,有大写会返回空即没有命中,match 则是不区分大小写都可以进行查询,返回结果也一样)

# 范围查询s = s.filter("range", timestamp={"gte": 0, "lt": time.time()}).query("match", country="in")# 普通过滤res_3 = s.filter("terms", balance_num=["39225", "5686"]).execute()

其他写法:

s = Search()s = s.filter('terms', tags=['search', 'python'])print(s.to_dict())# {'query': {'bool': {'filter': [{'terms': {'tags': ['search', 'python']}}]}}}s = s.query('bool', filter=[Q('terms', tags=['search', 'python'])])print(s.to_dict())# {'query': {'bool': {'filter': [{'terms': {'tags': ['search', 'python']}}]}}}s = s.exclude('terms', tags=['search', 'python'])# 或者s = s.query('bool', filter=[~Q('terms', tags=['search', 'python'])])print(s.to_dict())# {'query': {'bool': {'filter': [{'bool': {'must_not': [{'terms': {'tags': ['search', 'python']}}]}}]}}}

聚合可以放在查询,过滤等操作的后面叠加,需要加 aggs。

bucket 即为分组,其中第一个参数是分组的名字,自己指定即可,第二个参数是方法,第三个是指定的 field。

metric 也是同样,metric 的方法有 sum、avg、max、min 等,但是需要指出的是,有两个方法可以一次性返回这些值,stats 和 extended_stats,后者还可以返回方差等值。

# 实例1s.aggs.bucket("per_country", "terms", field="timestamp").metric("sum_click", "stats", field="click").metric("sum_request", "stats", field="request")# 实例2s.aggs.bucket("per_age", "terms", field="click.keyword").metric("sum_click", "stats", field="click")# 实例3s.aggs.metric("sum_age", "extended_stats", field="impression")# 实例4s.aggs.bucket("per_age", "terms", field="country.keyword")# 实例5,此聚合是根据区间进行聚合a = A("range", field="account_number", ranges=[{"to": 10}, {"from": 11, "to": 21}])res = s.execute()

最后依然要执行 execute(),此处需要注意,s.aggs 操作不能用变量接收(如 res=s.aggs,这个操作是错误的),聚合的结果会保存到 res 中显示。

排序

s = Search().sort('category', '-title', {"lines" : {"order" : "asc", "mode" : "avg"}})

分页

s = s[10:20]# {"from": 10, "size": 10}

一些扩展方法,感兴趣的同学可以看看:

s = Search()# 设置扩展属性使用`.extra()`方法s = s.extra(explain=True)# 设置参数使用`.params()`s = s.params(search_type="count")# 如要要限制返回字段,可以使用`source()`方法# only return the selected fieldss = s.source(['title', 'body'])# don't return any fields, just the metadatas = s.source(False)# explicitly include/exclude fieldss = s.source(include=["title"], exclude=["user.*"])# reset the field selections = s.source(None)# 使用dict序列化一个查询s = Search.from_dict({"query": {"match": {"title": "python"}}})# 修改已经存在的查询s.update_from_dict({"query": {"match": {"title": "python"}}, "size": 42})

参考文档:

http://fingerchou.com/2017/08/12/elasticsearch-dsl-with-python-usage-1/

http://fingerchou.com/2017/08/13/elasticsearch-dsl-with-python-usage-2/

https://blog.csdn.net/JunFeng666/article/details/78251788

elasticsearch in查询_Python Elasticsearch DSL 查询、过滤、聚合操作实例相关推荐

  1. Elasticsearch--进阶-进阶两种查询方式_request uri查询和query DSL查询---全文检索引擎ElasticSearch工作笔记009

    然后我们再来去查询高级一点的检索 1.可以看到在es中,支持两种方式的查询,一种是基于rest request uri,把请求的信息,放到http的地址上. 2.第二种方式就是使用REST reque ...

  2. python 表格查询_python单表查询

    创建表 create table employee( id intnotnull unique auto_increment, name varchar(20) notnull, sex enum(' ...

  3. python mongodb分页查询_python数据库分页查询语句

    用django将数据从数据库提出并分页展示 不要笑这个太简单噢~~大神们路过的请自动忽略本文-- '''django有自带的分页功能,我这个是自己做的分页,效果其实是一样的. ''' 要把数据提出并展 ...

  4. 实现mysql百度式查询_Python + MySQL 批量查询百度收录

    做SEO的同学,经常会遇到几百或几千个站点,然后对于收录情况去做分析的情况 那么多余常用的一些工具在面对几千个站点需要去做收录分析的时候,那么就显得不是很合适. 在此特意分享给大家一个批量查询百度收录 ...

  5. python调用接口查询_python调用接口查询 顺丰单号 物流信息

    爱查快递 查询 顺丰单号 物流信息 Query.sign = function() { function t(t) { var e, i, s, a, r = -1; for (e = 0, s = ...

  6. python mysql批量查询_Python + MySQL 批量查询百度收录

    做SEO的同学,经常会遇到几百或几千个站点,然后对于收录情况去做分析的情况 那么多余常用的一些工具在面对几千个站点需要去做收录分析的时候,那么就显得不是很合适. 在此特意分享给大家一个批量查询百度收录 ...

  7. python redis 人员信息查询_python redis 模块查询数据结果 bytes 类型转码的方法

    通过使用 python redis 模块的 client 进行数据获取时,如果没有专门设置,会获取到 b 开头的二进制类型,这是因为 redis 模块客户端交互时默认是 bytes 类型存储,其实初始 ...

  8. python random库生成伯努利随机数的方法_Python使用random模块生成随机数操作实例详解...

    本文实例讲述了Python使用random模块生成随机数操作.分享给大家供大家参考,具体如下: 今天在用Python编写一个小程序时,要用到随机数,于是就在网上查了一下关于Python生成各种随机数的 ...

  9. python对文件操作实例_Python对文件文件夹的操作实例

    代码背景: 最近老看视频教程,我需要知道一部教程,需要多久能看完.win下文件夹里,多选视频文件,可以直接在属性中查看一共需要的时间.不过在网上下载的很多视频教程每一章都分布在不同的文件夹下,无法快捷 ...

最新文章

  1. BERT的成功是否依赖于虚假相关的统计线索?
  2. 成绩统计自动计算表格_电气计算太慢?62套自动计算EXCEL表格,一键下载秒出结果...
  3. axios的简单使用
  4. Spring MVC 基础
  5. outlook的插件管理(Web界面)
  6. python中如何对dict对象进行排序
  7. tr069相关协议说明
  8. reportviewer动态数据源
  9. keil和proteus的联调设置
  10. 用诗歌描写计算机课,小班诗歌公开课教案范文【3篇】
  11. 服务器维护需要log日志,什么是服务器日志?服务器日志要怎么看?
  12. 洛谷月赛 P3406 海底高铁
  13. jquery中去重复排序(函数: $.grep() join() sort() )
  14. 使用 Django 的日志模块,同时发送错误邮件到163邮箱
  15. esxi不能识别Intel 网卡怎么办
  16. matlab 振动,振动系统固有特性的matlab计算
  17. linux时间戳转时间
  18. SQL Express几个版本的区别
  19. fanuc机器人示教器输入中文注释
  20. J2EE进阶之JSP和EL表达式 十二

热门文章

  1. 使用Systemd包装SpringBoot应用
  2. leetcode 497, 528. Random Point in Non-overlapping Rectangles | 497. 非重叠矩形中的随机点(Java)
  3. leetcode 210. Course Schedule II | 210. 课程表 II(Java)
  4. 左神算法:两个单链表相交的一系列问题(链表是否有环 / 两无环链表是否相交 / 两有环链表是否相交)
  5. 数据结构:利用栈,将递归转换为非递归的方法
  6. 【Git】切换分支,以及git stash的使用
  7. 【JavaScript】Document对象学习
  8. 牛客网 对称平方数【回文数的判断 两个vector是否相等】
  9. 突发!HashiCorp禁止在中国使用企业版VAULT软件
  10. 关于可变字符串StringBuffer和String的区别总结