
1.3 Elasticsearch的Python客户端
首先介绍Elasticsearch的安装以及Python客户端的基本使用,然后介绍如何定义索引结构。
1.3.1 安装Elasticsearch
如果在Windows操作系统下,则可以从https://www.elastic.co/cn/downloads/elasticsearch下载Elasticsearch的安装包。这里使用的版本为7.8.0。得到文件elasticsearch-7.8.0.zip。
直接解压至某目录,例如D:\elasticsearch-7.8.0。下载完解压后有以下几个路径:bin是运行的脚本;config是设置文件;lib中放的是依赖包。到目录D:\elasticsearch-7.8.0\bin下,运行elasticsearch.bat。
如果显示Java虚拟机(Java Virtual Machine,JVM)内存不够,则可以在D:\elasticsearch-7.8.0\config\jvm.options配置文件中调整内存大小。其中,Xms参数表示堆空间的初始大小;Xmx参数表示堆空间的最大大小。应该把最小和最大JVM堆设置成相同的值。例如:
-Xms4g -Xmx4g
成功启动Elasticsearch后,在浏览器中打开网址:http://localhost:9200/。
启动成功后,会在解压目录下增加2个文件夹:data用于存储索引数据;logs用于日志记录。因为创建索引耗时,所以预先将文档写入一个日志目录。
如果使用Linux的Ubuntu发行版,则可以用debian安装包安装Elasticsearch;如果使用RedHat Enterprise Linux,则可以使用RPM包安装Elasticsearch。
在Windows操作系统下,启动Elasticsearch服务:
> bin\elasticsearch.bat
通过HTTP(Hyper Text Transfer Protocol,超文本传输协议)发送指令和Elasticsearch交互。curl是一个知名的网络命令行工具,可以用来发送GET或者POST命令。在Linux下默认已经安装了这个命令行工具,可以用curl命令行访问网址http://localhost:9200/:
> curl http://localhost:9200/
或者在命令行外壳程序PowerShell中运行:
> Invoke-RestMethod http://localhost:9200
在Windows下可以用Python代码测试Elasticsearch服务:

Kibana是Elasticsearch的开源数据可视化仪表板,可以在Kibana控制台发送命令给Elasticsearch。在Windows操作系统下,Kibana可以使用.zip软件包安装,从https://www.elastic.co/cn/downloads/kibana下载Kibana安装包。
在编辑器中打开配置文件config/kibana.yml设置Elasticsearch实例:
elasticsearch.hosts: ["http://localhost:9200"]
在Windows操作系统下运行bin\kibana.bat,以启动Kibana。
在浏览器中打开网址http://localhost:5601进入Kibana的管理界面。
如果无法正常访问,则可以用如下命令检查端口占用情况。
>netstat -ano | findstr 5601
如果仍然无法正常使用,则可以先测试X-Pack插件或者检查Elasticsearch中插件的安装情况。
1.3.2 基本使用
elasticsearch-py(https://github.com/elastic/elasticsearch-py)是Elasticsearch的官方底层Python客户端。Elasticsearch DSL(https://github.com/elastic/elasticsearch-dsl-py)是高层客户端。
先介绍elasticsearch-py的使用。使用pip命令安装elasticsearch模块:
pip install elasticsearch
定义索引:

简单的用法如下:

索引和查询员工的例子:




从指定位置返回结果:
#设置size选项,确定要返回的搜索命中数 test=es.search(index=['test'], size=1000, from_=0)
使用函数enumerate()返回结果:

接下来介绍Elasticsearch DSL的使用。安装模块:
pip install elasticsearch-dsl
直接写成一个dict的典型的搜索请求如下:

这种方法的问题是它非常冗长,容易出现语法错误,例如错误的嵌套、难以修改(如添加另一个过滤器)。
用Python DSL重写示例:

用一个简单的Python类,代表博客系统中的一篇文章:

接下来介绍摄取处理器插件的使用。
首先安装attachment插件:
#sudo bin/elasticsearch-plugin install ingest-attachment
然后重新启动Elasticsearch,让插件生效。
在Python客户端创建一个管道,然后使用摄取处理器插件attachment,如下所示:

1.3.3 定义索引结构
要将JSON数据传递给方法的body参数,用于创建Elasticsearch映射的Python字典,代码如下:

可以更改分片和副本设置:

index.create()方法的API调用的基本布局如下:

调用该方法时,只有两个必需的参数:一个是以字符串形式传递到索引的索引名称;另一个是将Python字典传递给方法的body参数。但是,有一个选项可以指示Elasticsearch忽略指定的HTTP错误代码。

如果执行得当,Elasticsearch集群应返回一个Python字典。该字典在响应中具有值为“True”的“acknowledged”键,如下所示:

评估命令的Python条件语句如下所示:

使用Kibana控制台或curl请求可以验证索引及其映射是否已正确创建。
定义索引结构的完整Python代码如下:

Elasticsearch不会分析Keyword数据类型,这意味着索引的字符串将保持不变。Keyword数据类型可用于聚合列。
与Keyword字段数据类型不同,索引到text类型的字符串在存储到反向索引中之前将经过分析器处理。默认情况下,Elasticsearch的标准分析器将拆分并小写化索引的字符串。