天天看点

Python Elasticsearch DSL1. Configuration2. Search DSL

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

对象声明了全部的搜索条件:

  • 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

到请求中

继续阅读