1. Configuration
为library配置连接
Note: 当使用
elasticsearch_dsl
时, 我们高度推荐使用内建的serializer(
elasticsearch_dsl.serializer.serializer
)去确保你的对象可以被正确的序列化为JSON.
create_connection
方法会自动的帮你做这些事情, 除非你明确的规定了你自己的serializer. 只需要定义一个
to_dict()
方法在你的对象上,内置的serializer也可以序列化你自己的对象.当你序列化你自定义的对象到JSON时,
to_dict()
方法会自动的被调用.
Note: 除非你想连接多个clusters, 非常推荐使用create_connection方法. 并且所有的操作都会自动使用哪个连接.
默认连接(Default connection)
定义一个可以在全局使用的的默认连接, 需要使用
connections
块(module)下的
create_connection
方法.如下:
In [1]: from elasticsearch_dsl import connections
In [2]: connections.create_connection(hosts=['localhost'], timeout=20)
Out[2]: <Elasticsearch([{'host': 'localhost'}])>
单个连接并取一个别名(Single connection with an alias)
为连接取一个别名如下:
from elasticsearch_dsl import connections
connections.create_connection(alias='my_new_connection', hosts=['localhost'], timeout=60)
alias
的默认值是
default
.
额外的关键字参数(如
host
和
timeout
)会传递给
elasticsearch-py
下的
Elasticsearch
类
多个集群(Multiple clusters)
你可以定义多个连接到多个集群
from elasticsearch_dsl import connections
connections.configure(
default={'hosts': 'localhost'},
dev={
'hosts': ['esdev1.example.com:9200'],
'sniff_on_start': True
}
)
也可以一个一个的建立
# if you have configuration options to be passed to Elasticsearch.__init__
# this also shows creating a connection with the alias 'qa'
connections.create_connection('qa', hosts=['esqa1.example.com'], sniff_on_start=True)
# if you already have an Elasticsearch instance ready
connections.add_connection('another_qa', my_client)
使用别名,如下
如果别名不存在会抛出
KeyError
手动操作
如果你不想使用一个全局配置. 你可以通过
using
传递一个你自己的连接实例
elasticsearch.Elasticsearch
. 如下:
也可以通过
using
覆盖任何的连接
s = s.using(Elasticsearch('otherhost:9200'))
2. Search DSL
Search
对象
Search
Search
对象声明了全部的搜索条件:
- queries
- filters
- aggregations
- sort
- pagination
- additional parameters
- associated client
这个API被设计成可连接的(chainable).
当实例化
Search
对象时, 需要传递一个底层的elasticsearch client实例
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
client = Elasticsearch()
s = Search(using=client)
在之后可以自己定义client
Note: 所有的方法都会返回一个对象的拷贝, 使其可以安全的传递外部代码
这个API是chainable的, 允许你在一个声明中连接多个方法
s = Search().using(client).query("match", title="python")
发送这个请求到Elasticsearch
如果你只想遍历(iterate)命中数据
for hit in s:
print(hit.title)
搜索结果会被缓存. 随后调用
execute
或遍历一个已经执行后的Search对象将不会触发额外的发送到Elasticsearch的请求. 为了在调用
execute
时强制执行, 可以设置
ignore_cache=True
到请求中