Elasticserch与Elasticsearch_dsl用法

Elasticsearch_dsl::https://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html

Elasticserch:https://elasticsearch-py.readthedocs.io/en/master/api.html

1. 连接

from elasticsearch import Elasticsearch
es = Elasticsearch(hosts="127.0.0.1:9200") # connections可以设置多个集群
from elasticsearch_dsl import connections
es = connections.create_connection(hosts=['localhost:9200'], timeout=60)
 

2. 查询

from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search client = Elasticsearch()
s = Search(using=client)
 

API是可链接的,允许在一个语句中组合多个方法调用:

s = Search().using(client).query("match", title="python")
 

要将请求发送到Elasticsearch:

response = s.params(size=10000).execute()
# params(size) 为指定搜索结果返回条数,默认size是10,最大size为10000
 

如果只想迭代搜索返回的命中,可以遍历该Search对象:

for hit in s:
print(hit.title)
 

搜索结果将被缓存。后续调用execute或尝试迭代已执行的Search对象不会触发发送到Elasticsearch的其他请求。强制请求指定 ignore_cache=True何时调用execute

出于调试目的,可以将Search对象序列化为dict 显式:

s = Search().using(client).query("match", title="python")
print(s.to_dict())
 
按查询删除

可以通过调用对象来删除与搜索匹配的文档deleteSearch而不是 execute像这样:

s = Search(index='i').query("match", title="python")
response = s.delete()
 
2.1 Q
from elasticsearch_dsl import Q

Q("multi_match", query='python django', fields=['title', 'body'])
Q({"multi_match": {"query": "python django", "fields": ["title", "body"]}})
 

要将查询添加到Search对象,使用.query()方法:

q = Q("multi_match", query='python django', fields=['title', 'body'])
s = Search().query(q)
 

该方法还接受所有参数作为Q快捷方式:

s = s.query("multi_match", query='python django', fields=['title', 'body'])
 

如果已有查询对象或dict表示查询对象,则可以覆盖Search对象中使用的查询:

s.query = Q('bool', must=[Q('match', title='python'), Q('match', body='best')])
 
2.2 虚线字段

有时想要引用另一个字段中的字段,可以是多字段(title.keyword),也可以是结构化json文档address.city。为了更方便的Q快捷方式(还有 queryfilter以及exclude对方法Search的类),可以使用__(双下划线)代替关键字参数点的:

s = Search()
s = s.filter('term', category__keyword='Python')
s = s.query('match', address__city='prague')
 

或者:

s = Search()
s = s.filter('term', **{'category.keyword': 'Python'})
s = s.query('match', **{'address.city': 'prague'})
 
2.3 查询组合

可以使用逻辑运算符组合查询对象:

Q("match", title='python') | Q("match", title='django')
# {"bool": {"should": [...]}} Q("match", title='python') & Q("match", title='django')
# {"bool": {"must": [...]}} ~Q("match", title="python")
# {"bool": {"must_not": [...]}}
 

.query()多次调用该方法时,&将在内部使用该运算符:

s = s.query().query()
print(s.to_dict())
# {"query": {"bool": {...}}}
 

如果要对查询表单进行精确控制,使用Q快捷方式直接构造组合查询:

q = Q('bool',
must=[Q('match', title='python')],
should=[Q(...), Q(...)],
minimum_should_match=1
)
s = Search().query(q) # start_time为开始时间,end_time为结束时间
q = Q('bool', must=[Q('range', start_time={"gte": start_time}), Q('range', end_time={"lte": end_time})])
s = Search().query(q)
2.4 过滤器

如果要在Search之后添加查询, 可以使用该filter()方法使事情变得更容易:

s = Search()
s = s.filter('terms', tags=['search', 'python']) # 过滤,在此为范围过滤,range是方法,timestamp是所要查询的field的名字,gte意为大于等于,lt意为小于,根据需要设定即可(似乎过滤只能接受数字形式的内容,如果是文本就会返回空)
# 关于term和match的区别,term是精确匹配,match会模糊化,会进行分词,返回匹配度分数,(term查询字符串之接受小写字母,如果有大写会返回空即没有命中,match则是不区分大小写都可以进行查询,返回结果也一样) 例1:范围查询
s = s.filter("range", timestamp={"gte": 0, "lt": time.time()}).query("match", country="in")
例2:普通过滤
res_3 = s.filter("terms", balance_num=["39225", "5686"]).execute()
 

在幕后,这将生成一个Bool查询并将指定的 terms查询放入其filter分支,使其等效于:

s = Search()
s = s.query('bool', filter=[Q('terms', tags=['search', 'python'])])
 

如果要将post_filter元素用于分面导航,请使用该 .post_filter()方法。

exclude()可以查询查询中的项目,如下所示:

s = Search()
s = s.exclude('terms', tags=['search', 'python'])
 

这是简写: s = s.query('bool', filter=[~Q('terms', tags=['search', 'python'])])

2.5 聚合

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

要定义聚合,可以使用A快捷方式:

from elasticsearch_dsl import A

A('terms', field='tags')
# {"terms": {"field": "tags"}}
 

也可以使用.bucket().metric().pipeline()方法

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

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

a = A('terms', field='category')
# {'terms': {'field': 'category'}} a.metric('clicks_per_category', 'sum', field='clicks').bucket('tags_per_category', 'terms', field='tags')
# {
# 'terms': {'field': 'category'},
# 'aggs': {
# 'clicks_per_category': {'sum': {'field': 'clicks'}},
# 'tags_per_category': {'terms': {'field': 'tags'}}
# }
# } # 例1
s.aggs.bucket("per_country", "terms", field="timestamp").metric("sum_click", "stats", field="click").metric("sum_request", "stats", field="request") # 例2
s.aggs.bucket("per_age", "terms", field="click.keyword").metric("sum_click", "stats", field="click") # 例3
s.aggs.metric("sum_age", "extended_stats", field="age") # 例4
s.aggs.bucket("per_age", "terms", field="country.keyword")
# 最后依然是要execute,此处注意s.aggs的操作不能用变量接收(如res=s.aggs的操作就是错误的),聚合的结果会在res中显示 # 例5
a = A("range", field="account_number", ranges=[{"to": 10}, {"from": 11, "to": 21}]) res = s.execute()
 

要向Search对象添加聚合,请使用.aggs属性作为顶级聚合:

s = Search()
a = A('terms', field='category')
s.aggs.bucket('category_terms', a)
# {
# 'aggs': {
# 'category_terms': {
# 'terms': {
# 'field': 'category'
# }
# }
# }
# }
 

要么

s = Search()
s.aggs.bucket('articles_per_day', 'date_histogram', field='publish_date', interval='day')\
.metric('clicks_per_day', 'sum', field='clicks')\
.pipeline('moving_click_average', 'moving_avg', buckets_path='clicks_per_day')\
.bucket('tags_per_day', 'terms', field='tags') s.to_dict()
# {
# "aggs": {
# "articles_per_day": {
# "date_histogram": { "interval": "day", "field": "publish_date" },
# "aggs": {
# "clicks_per_day": { "sum": { "field": "clicks" } },
# "moving_click_average": { "moving_avg": { "buckets_path": "clicks_per_day" } },
# "tags_per_day": { "terms": { "field": "tags" } }
# }
# }
# }
# }
 

您可以按名称访问现有的key(类似字典的方式):

s = Search()
s.aggs.bucket('per_category', 'terms', field='category')
s.aggs['per_category'].metric('clicks_per_category', 'sum', field='clicks')
s.aggs['per_category'].bucket('tags_per_category', 'terms', field='tags')
 

3.删除

es.delete(index='xxx', doc_type='xxx', id='xxx')
 

4.更新

body = {'doc': {}}
body['doc']['filed_name'] = '新的值'
es.update(index=_index, doc_type='alarm', id='xxx', body=body)
es.update(index='xxx', doc_type='xxx', id='xxx', body={待更新字段})
 
 

Elasticserch与Elasticsearch_dsl用法的更多相关文章

  1. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  2. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  3. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  4. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  5. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  6. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  7. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  8. chattr用法

    [root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...

  9. 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)

    vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...

随机推荐

  1. JMeter 结果处理常见问题

    1. 前言 2. 结果处理常见问题 1)在察看结果树中只看失败情况 2)如何把日志放入文件查看 3)cvs 文件中文读取乱码 4)失败请求数据的采集 5)结果树响应数据中文乱码解决办法 1. 前言 工 ...

  2. JMeter 实战案例

    案例1:博客网站后端测试 案例2:JPetStore 应用 案例1:博客网站后端测试 测试目标 测试博客网站后端的常用 HTTP 接口的访问方法. 展示 HTTP 请求的各类使用方法. 展示提取 JS ...

  3. OO博客总结——OO落下帷幕

    OO博客总结--OO落下帷幕 凡此过往,皆为序章. 不知不觉OO课程即将落下帷幕,一路坎坎坷坷磕磕绊绊,可算是要结束了,心里终于松了一口气,也有小小的不甘和遗憾.凡此过往,皆为序章.特殊的线上OO课程 ...

  4. 04- 移动APP功能测试要点以及具体业务流程测试

    5.离线测试: 离线是应用程序在本地的客户端会缓存一部分数据以供程序下次调用. 1.对于一些程序,需要在登录进来后,这是没有网络的情况下可以浏览本地数据. 2.对于无网络时,刷新获取新数据时,不能获取 ...

  5. Linux安装MySQL8高版本压缩包(通用)

    前言 前段时间领导让我部署测试环境,希望安装高版本的MySQL,过程遇到很多问题,特此记录帮助迷失的人们 下载 MySQL官方下载地址:https://dev.mysql.com/downloads/ ...

  6. Linux获取权限

    目录 Bash反弹shell Python反弹shell 写入命令到定时任务文件 写入SSH公钥 写入/etc/profile文件 当我们可以在远程Linux主机上执行任意命令或写入任意数据到任意文件 ...

  7. CVE-2013-3346:十全九美的 Adobe Reader ToolButton UAF 漏洞

    0x01 "Epic Turla" 网络间谍行动 在 2014 年 8 月,被誉为 "世界十大最危险的网络攻击行动" 之一的 "Epic Turla& ...

  8. [转载] 关于Win7 x64下过TP保护的一些思路,内核层过保护,驱动过保护

    首先特别感谢梦老大,本人一直没搞懂异常处理机制,看了他的教程之后终于明白了.在他的教程里我学到了不少东西.第一次在论坛发帖,就说说Win7 x64位下怎么过TP保护.如果有讲错的地方,还望指出.说不定 ...

  9. postman使用教程7-参数化引用外部文件测试数据

    前言 当同一个接口需要测试不同的参数时,需用到参数化的概念.postman支持从外部文件读取测试数据参数化 设置参数化变量 新建一个collections 专门测试登录接口 设置集合变量usernam ...

  10. 【】POST、GET、RequestParam、ReqestBody、FormData、request payLoad简单认知

    背景: 使用vue+axios方式代替ajax后向后台发送数据出现问题了,controller获取不到数据.然后查.找.查.找中似乎找到一些门道.以下列出总结性的东西来记录自己的思考成果,仅供参考,不 ...