客户端助手
您可以在这里找到一系列简单的辅助函数,它们抽象了原始 API 的一些具体细节。
批量 API 有几个辅助函数,因为其对特定格式和其他考虑因素的要求,如果直接使用可能会很麻烦。
所有批量助手都接受一个 Elasticsearch 类的实例和一个可迭代的 action(任何可迭代对象,也可以是生成器,这在大多数情况下是理想的,因为它允许您索引大型数据集而无需将其加载到内存中)。对于异步 Python,请使用带有 async_ 前缀的批量助手,并将一个 AsyncElasticsearch 实例作为第一个参数传入。
可迭代对象 action 中的项应该是我们希望以多种格式索引的文档。最常见的一种与 search() 返回的格式相同,例如
{
'_index': 'index-name',
'_id': 42,
'_routing': 5,
'pipeline': 'my-ingest-pipeline',
'_source': {
"title": "Hello World!",
"body": "..."
}
}
或者,如果 _source 不存在,它会从文档中弹出所有元数据字段,并将其余部分用作文档数据
{
"_id": 42,
"_routing": 5,
"title": "Hello World!",
"body": "..."
}
bulk() API 接受 index、create、delete 和 update 操作。使用 _op_type 字段指定操作(_op_type 默认为 index)。
{
'_op_type': 'delete',
'_index': 'index-name',
'_id': 42,
}
{
'_op_type': 'update',
'_index': 'index-name',
'_id': 42,
'doc': {'question': 'The life, universe and everything.'}
}
在 scroll() API 之上的简单抽象——一个简单的迭代器,它按底层滚动请求返回的所有匹配项。
默认情况下,扫描不按任何预定顺序返回结果。要在滚动时让返回的文档具有标准顺序(无论是按分数还是显式排序定义),请使用 preserve_order=True。这可能是一个昂贵的操作,并且会抵消使用 scan 的性能优势。
from elasticsearch.helpers import scan
es = Elasticsearch(hosts=['https://:9200'])
scan(
es,
query={"query": {"match": {"title": "python"}}},
index="orders-*"
)
from elasticsearch.helpers import async_scan
es = AsyncElasticsearch(hosts=['https://:9200'])
async def main():
await async_scan(
es,
query={"query": {"match": {"title": "python"}}},
index="orders-*"
asyncio.run(main())