elasticsearch-dsl是基于elasticsearch-py封装实现的,提供了更简便的操作elasticsearch的方法。
安装:
install elasticsearch_ds
连接elasticsearch
from elasticsearch_dsl import connections, Search es = connections.create_connection(hosts=["127.0.0.1:9200"], timeout=20) print(es)
还可以通过alias给连接设置别名,后续可以通过别名来引用该连接,默认别名为default。
from elasticsearch_dsl import connections, Search # 方式一:连接es es = connections.create_connection(hosts=["127.0.0.1:9200"], timeout=20) print(es) # 方式二:连接es connections.create_connection(alias="my_new_connection", hosts=["127.0.0.1:9200"], timeout=20)
elasticsearch_dsl.Search
search对象代表整个搜索请求,包括:queries、filters、aggregations、sort、pagination、additional parameters、associated client。
API被设置为可链接的即和用.连续操作。search对象是不可变的,除了聚合,对对象的所有更改都将导致创建包含该更改的浅表副本。
当初始化Search对象时,传递elasticsearch客户端作为using的参数
示例代码1:
from elasticsearch_dsl import connections, Search # 方式一:连接es es = connections.create_connection(hosts=["127.0.0.1:9200"], timeout=20) # print(es) # 方式二:连接es connections.create_connection(alias="my_new_connection", hosts=["127.0.0.1:9200"], timeout=20) # 不使用别名使用 res = Search(using=es).index("test_index").query() # print(res) for data in res: print(data.to_dict()) print("*" * 100) # 使用别名后这样使用 res2 = Search(using="my_new_connection").index('test_index').query() # print(e) for data in res2: print(data.to_dict())
运行结果
示例代码2:
from elasticsearch_dsl import connections, Search # 方式一:连接es es = connections.create_connection(hosts=["127.0.0.1:9200"], timeout=20) # print(es) # 不使用别名使用 res = Search(using=es).index("test_index").query() # print(res) for data in res: print(data.to_dict()) print("*" * 100) # 书写方式一:按条件查询数据 res2 = Search(using=es).index("test_index").query("match", name="张三") # 查询时注意分词器的使用 for data in res2: print(data.to_dict()) print("*" * 100) # 书写方式二:按条件查询数据 res3 = Search(using=es).index("test_index").query({"match": {"name": "张三"}}) for data in res3: print(data.to_dict())
运行结果:
在上述执行execute方法将请求发送给elasticsearch:
response = res.execute()
不需要执行execute()方法,迭代后可以通过to_dict()方法将Search对象序列化为一个dict对象,这样可以方便调试。
query方法
查询,参数可以是Q对象,也可以是query模块中的一些类,还可以是自已写上如何查询。
示例代码1:
from elasticsearch_dsl import connections, Search, Q import time # 方式一:连接es es = connections.create_connection(hosts=["127.0.0.1:9200"], timeout=20) # print(es) res = Search(using=es, index="test_index").query().query() # 当调用.query()方法多次时,内部会使用&操作符 print(res.to_dict())
运行结果:
filter方法
在过滤上下文中添加查询,可以使用f