注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】
自然语言处理系列四十六
Elasticsearch搜索引擎》Elasticsearch安装部署和使用
在Centos7环境下的Linux服务器上安装Elasticsearch五个节点为例为大家讲解安装部署过程。
- 准备工作
官网下载elasticsearh-x.x.x最新版本
下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
选取最新或者你需要的对应版本下载
把下载的压缩包上传服务器后解压:
tar -zxvf elasticsearch-x.x.x.tar.gz
cd ***/elasticsearch-x.x.x - 修改文件config/elasticsearch.yml
Elasticsearch配置文件写法:
使用两个空格作为一级缩进是 YAML 的约定,不能使用制表符(Tab)来代替
以“:”为结束符的字符串,代表了一个键名,“:”后面则是键值。“:”和键值之间必须有至少一个空格。
列表的元素前面的“-”必不可少,并且要跟随至少一个空格。也可以使用- [value1, value2, value3] 表示列表
修改配置elasticsearch.yml文件并加入防脑裂配置:
cluster.name: chongdianleme-elasticsearch-application
node.name: node-1
network.host: 172.172.0.11
http.port: 9200
discovery.zen.minimum_master_nodes: 3
http.cors.enabled: true
http.cors.allow-origin: “*”
discovery.zen.ping.unicast.hosts: [“172.172.0.11”,“172.172.0.12”,“172.172.0.13”,“172.172.0.14”,“172.172.0.15”]
建议根据服务器硬件配置到bin/elasticsearch脚本中修改占用jvm的大小:
ES_JAVA_OPTS=“-Xms8g -Xmx8g” ./bin/elasticsearch
复制到其他机器上,五台服务器上分别做类似设置修改,然后以后台进程方式启动Elasticsearch服务。
- [value1, value2, value3] 表示列表
- 启动Elasticsearch后台服务
在每个节点执行
"su hadoop -c ‘nohup /home/hadoop/software/elasticsearch-x.x.x/bin/elasticsearch &’"启动elasticsearch后台程序,并放到后台执行
启动时注意:
1)当我们把当前终端关闭的话,之前在后台启动的进程也会被停掉。所以如果想要避免这种情况就需要在刚才执行的命令前面都加一个nohup命令
2)启动Elasticsearch 后台进程时,需要对config/elasticsearch.yml配置文件中设置的目录具有写权限。
Elasticsearch安装启动后,本身没有像Solr Cloud类似的管理界面,需要再单独安装Elasticsearch-head插件才会有。 - Elasticsearch-head插件安装
ElasticSearch-head就是一款能连接ElasticSearch搜索引擎,并提供可视化的操作页面对ElasticSearch搜索引擎进行各种设置和数据检索功能的管理插件,如在head插件页面编写RESTful接口风格的请求,就可以对ElasticSearch中的数据进行增删改查、创建或者删除索引等操作。类似于使用navicat工具连接MySQL这种关系型数据库,对数据库做操作。
1)环境检查
Es-head插件运行需要node.js环境,确保安装有node.js,如果未安装,自行安装
node -v npm -v
2)下载以及安装head插件
下载地址:https://github.com/mobz/elasticsearch-head
使用git克隆并安装的命令脚本如下:
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start
open http://localhost:9100/
我们用这种最简单的方式安装,当然我们安装的地方是/usr/local/。
3)配置elasticsearch允许head插件访问
进入elasticsearch config目录 打开 elasticsearch.yml最后加上
http.cors.enabled: true
http.cors.allow-origin: “*”
4)启动Elasticsearch访问管理Web界面
启动elasticsearch,再进入head目录,执行npm run start 启动插件,然后浏览器访问Web管理界面地址就可以了:http://172.172.0.11:9100/ - Elasticsearch的RESTful API接口
Elasticsearch提供了多种交互使用方式,包括Java API和RESTful API ,本文主要介绍RESTful API 。所有其他语言可以使用RESTful API 通过端口 9200 和 Elasticsearch 进行通信,你可以用你最喜爱的 web 客户端访问 Elasticsearch 。甚至,你还可以使用 curl 命令来和 Elasticsearch 交互。
一个Elasticsearch请求和任何 HTTP 请求一样,都由若干相同的部件组成:
curl -X ‘😕/:/?<QUERY_STRING>’ -d ‘’
返回的数据格式为JSON,因为Elasticsearch中的文档以JSON格式储存。其中,被 < > 标记的部件,参数如表12.4所示。
部件 说明
VERB 适当的 HTTP 方法 或 谓词 : GET、 POST、 PUT、 HEAD 或者 DELETE。
PROTOCOL http 或者 https(如果你在 Elasticsearch 前面有一个 https 代理)
HOST Elasticsearch 集群中任意节点的主机名,或者用 localhost 代表本地机器上的节点。
PORT 运行 Elasticsearch HTTP 服务的端口号,默认是 9200 。
PATH API 的终端路径(例如 _count 将返回集群中文档数量)。Path 可能包含多个组件,例如:_cluster/stats 和 _nodes/stats/jvm 。
QUERY_STRING 任意可选的查询字符串参数 (例如 ?pretty 将格式化地输出 JSON 返回值,使其更容易阅读)
BODY 一个 JSON 格式的请求体 (如果请求需要的话)
表12.4 Elasticsearch参数说明
对于HTTP方法,它们的具体作用如表12.5所示。
HTTP方法 说明
GET 获取请求对象的当前状态
POST 改变对象的当前状态
PUT 创建一个对象
DELETE 销毁对象
HEAD 请求获取对象的基础信息
表12.5 HTTP方法说明
我们以下面的数据为例,来展示Elasticsearch的用法,如表12.6所示。
表12.6 数据展示例子表格
先介绍下什么是ELK,ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。Logstash主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往Elasticsearch上去。Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。以下全部的操作都在Kibana中完成,创建的index为conference, type为event。
1)插入数据
首先创建index为conference, 创建type为event, 插入id为1的第一条数据,只需运行下面命令就行:
PUT /conference/event/1
{
“host”: “Dave”,
“title”: “Elasticsearch at Rangespan and Exonar”,
“description”: “Representatives from Rangespan and Exonar will come and discuss how they use Elasticsearch”,
“attendees”: [“Dave”, “Andrew”, “David”, “Clint”],
“date”: “2013-06-24T18:30”,
“reviews”: 3
}
在上面的命令中,路径/conference/event/1表示文档的index为conference, type为event, id为1。
2)删除数据
比如我们想要删除conference中event里面id为5的数据,只需运行下面命令即可:
DELETE /conference/event/5
返回结果如下:
{
“_index” : “conference”,
“_type” : “event”,
“_id” : “5”,
“_version” : 2,
“result” : “deleted”,
“_shards” : {
“total” : 2,
“successful” : 1,
“failed” : 0
},
“_seq_no” : 1,
“_primary_term” : 1
}
表示该文档已成功删除。如果想删除整个event类型,可输入命令:
DELETE /conference/event
如果想删除整个conference索引,可输入命令:
DELETE /conference
3)修改数据
修改数据的命令为POST, 比如我们想要将conference中event里面id为4的文档的作者改为Bob,那么需要运行命令如下:
POST /conference/event/4/_update
{
“doc”: {“host”: “Bob”}
}
返回的信息如下:(表示修改数据成功)
{
“_index” : “conference”,
“_type” : “event”,
“_id” : “4”,
“_version” : 7,
“result” : “updated”,
“_shards” : {
“total” : 2,
“successful” : 1,
“failed” : 0
},
“_seq_no” : 7,
“_primary_term” : 1
}
4)查询数据
查询数据的命令为GET,查询命令也是Elasticsearch最为重要的功能之一。比如我们想查询conference中event里面id为1的数据,运行命令如下:
GET /conference/event/1
返回的结果如下:
{
“_index” : “conference”,
“_type” : “event”,
“_id” : “1”,
“_version” : 2,
“found” : true,
“_source” : {
“host” : “Dave”,
“title” : “Elasticsearch at Rangespan and Exonar”,
“description” : “Representatives from Rangespan and Exonar will come and discuss how they use Elasticsearch”,
“attendees” : [
“Dave”,
“Andrew”,
“David”,
“Clint”
],
“date” : “2013-06-24T18:30”,
“reviews” : 3
}
}
在_source 属性中,内容是原始的 JSON 文档,还包含有其它属性,比如_index, _type, _id, _found等。
如果想要搜索conference中event里面所有的文档,运行命令如下:
GET /conference/event/_search
返回结果包括了所有四个文档,放在数组 hits 中。
当然,Elasticsearch 提供更加丰富灵活的查询语言叫做 查询表达式 , 它支持构建更加复杂和健壮的查询。利用查询表达式,我们可以检索出conference中event里面所有host为Bob的文档,命令如下:
GET /conference/event/_search
{
“query” : {
“match” : {
“host” : “Bob”
}
}
}
返回的结果只包括了一个文档,放在数组 hits 中。
接着,让我们尝试稍微高级点儿的全文搜索——一项传统数据库确实很难搞定的任务。搜索下所有description中含有"use Elasticsearch"的event:
GET /conference/event/_search
{
“query” : {
“match” : {
“description” : “use Elasticsearch”
}
}
}
返回的结果(部分)如下:
{
…
“hits” : {
“total” : 2,
“max_score” : 0.65109104,
“hits” : [
{
…
“_score” : 0.65109104,
“_source” : {
“host” : “Dave Nolan”,
“title” : “real-time Elasticsearch”,
“description” : “We will discuss using Elasticsearch to index data in real time”,
…
}
},
{
…
“_score” : 0.5753642,
“_source” : {
“host” : “Dave”,
“title” : “Elasticsearch at Rangespan and Exonar”,
“description” : “Representatives from Rangespan and Exonar will come and discuss how they use Elasticsearch”,
…
}
}
]
}
}
返回的结果包含了两个文档,放在数组 hits 中。让我们对这个结果做一些分析,第一个文档的description里面含有“using Elasticsearch”,这个能匹配“use Elasticsearch”是因为Elasticsearch含有内置的词干提取算法,之后两个文档按_score进行排序,_score字段表示文档的相似度(默认的相似度算法为BM25)。
如果想搜索下所有description中严格含有"use Elasticsearch"这个短语的event,可以使用下面的命令:
GET /conference/event/_search
{
“query” : {
“match_phrase”: {
“description” : “use Elasticsearch”
}
}
}
这时候返回的结果只有一个文档,就是上面输出的第二个文档。
通过RESTful API非常方便我们操作和熟悉Elasticsearch,但实际开发项目中都是用Java或Python等代码结合我们业务的项目代码一起使用,所以最终的项目还是要学会如何用代码如何去调用封装。下面我们看看Java代码使用Elasticsearch的例子。
Elasticsearch代码实战
下一篇文章详细讲解Elasticsearch代码实战,敬请关注。
总结
此文章有对应的配套新书教材和视频:
【配套新书教材】
《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】
新书特色:本书从自然语言处理基础开始,逐步深入各种NLP热点前沿技术,使用了Java和Python两门语言精心编排了大量代码实例,契合公司实际工作场景技能,侧重实战。
全书共分为19章,详细讲解中文分词、词性标注、命名实体识别、依存句法分析、语义角色标注、文本相似度算法、语义相似度计算、词频-逆文档频率(TF-IDF)、条件随机场、新词发现与短语提取、搜索引擎Solr Cloud和Elasticsearch、Word2vec词向量模型、文本分类、文本聚类、关键词提取和文本摘要、自然语言模型(Language Model)、分布式深度学习实战等内容,同时配套完整实战项目,例如对话机器人实战、搜索引擎项目实战、推荐算法系统实战。
本书理论联系实践,深入浅出,知识点全面,通过阅读本书,读者不仅可以理解自然语言处理的知识,还能通过实战项目案例更好地将理论融入实际工作中。
【配套视频】
自然语言处理NLP原理与实战 视频教程【陈敬雷】
视频特色:《自然语言处理NLP原理与实战》包含了互联网公司前沿的热门算法的核心原理,以及源码级别的应用操作实战,直接讲解自然语言处理的核心精髓部分,自然语言处理从业者或者转行自然语言处理者必听视频!
上一篇:自然语言处理系列四十五》Elasticsearch搜索引擎》Elasticsearch入门及技术原理
下一篇:自然语言处理系列四十七》Elasticsearch搜索引擎》Elasticsearch代码实战