ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎。
任务点
- 在Ubuntu下安装
- 在Windows下安装
- 使用Restful API实现搜索引擎的CURD操作
- 在Python网站Flask下使用ElasticSearch实现文章搜索
- ElasticSearch的Python连接器:Pyes
安装
Java (JVM) versionedit
Elasticsearch is built using Java, and requires at least Java 7 in order to run. Only Oracle’s Java and the OpenJDK are supported. The same JVM version should be used on all Elasticsearch nodes and clients.
We recommend installing the Java 8 update 20 or later, or Java 7 update 55 or later. Previous versions of Java 7 are known to have bugs that can cause index corruption and data loss. Elasticsearch will refuse to start if a known-bad version of Java is used.
The version of Java to use can be configured by setting the JAVA_HOME environment variable.
Linux(Ubuntu)下安装
Installing the oracle JDK
1 | sudo add-apt-repository ppa:webupd8team/java |
RPM based distributions
1 | sudo /bin/systemctl daemon-reload |
Windows下安装
从网站 下载windows下的msi安装包,
在cmd命令行进入安装目录,再进入 bin
目录,运行 elasticsearch.bat
。
Ubuntu下配置ElasticSearch环境实录
安装Java环境
由于ElasticSearch的运行需要Java环境的支持,先安装java环境。
由于Ubuntu系统中由于授权问题,默认只安装了OpenJDK的包,通过java
和javac
可以看到:
1 | * default-jdk |
根据ElasticSearch官方推荐安装方法:
1 | sudo add-apt-repository ppa:webupd8team/java |
如果出现如下提示信息,并有进度条显示,则说明运行顺利并正在下载所需文件:
1 | HTTP request sent, awaiting response... 200 OK |
否则可能由于网络原因或其他问题,会中断下载或报错。
错误一:
安装时出现错误:
1 | sha256sum mismatch jdk-8u91-linux-x64.tar.gz |
可以用该文章中介绍的方法解决,亲测有效:
http://www.miaoqiyuan.cn/p/ubuntu-e-sub-process-dpkg-returned-an-error-code
错误二:
根据上面的方法执行完命令后,执行 java -version
时只会显示下列输出信息:
1 | tiger@vbox:~$ java -version |
即使是重复执行上面的安装方法,结果仍是如此:
1 | tiger@vbox:~$ sudo apt-get install oracle-java8-installer |
根本问题是什么
转到目录/usr/lib/jvm/
下,可以看到一个名为 java-8-oracle
的目录,但查看该目录却发现里面是空的。所以虽然提示是安装成功了,但却没有可执行的文件,可能是在下载文件时出错了。
由于直接安装错误,下面尝试手动进行安装。
什么情况下表示安装成功,什么情况下表示安装失败
通过 java -version
来查看
如果输出如下,则说明 Orancel JDK 安装失败:
1 | root@ubuntu:~# java -version |
如果输出如下,则说明安装成功:
1 | tiger@vbox:/usr/lib/jvm$ java -version |
Ubuntu下手动安装JDK
- 到Oracle官网下载对应当前系统的jdk版本 Java SE Development Kit 8 Downloads :
1 | // 下载对应版本jdk压缩包,这里选择 `Linux64` |
将解压后的目录 jdk1.8.0_91
复制到 /usr/lib/jvm
目录里,
1 | sudo cp -r jdk1.8.0_91/ /usr/lib/jvm |
配置环境变量:
1 | sudo vim /etc/profile |
在文件的末尾添加以下内容:(注意对应自己的目录路径和jdk的版本号)
1 | JAVA_HOME=/usr/lib/jvm/jdk1.8.0_91 |
修改完后,执行 :wq
退出vim ,使用source
刷新一下:
1 | source /etc/profile |
然后执行:
1 | java -version |
下面的步骤未测试,仅供参考
如果到这一步,任然不成功的话,则属于手动配置默认的JDK版本:
1 | sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java/bin/java 300 |
参考 :
- Running as a Service on Linux | Elasticsearch Reference [2.3] | Elastic
- ubuntu 13.04 安装 JDK - plinx - 博客园
- 在 Ubuntu 系统上安装 Oracle Java 8 | 半瓶
安装ElasticSearch
下载最新安装包:
从 download Elasticsearch free 下载Linux的安装包:
1 | // 下载 |
进入解压后得到的目录 elasticsearch-2.3.3
,参考官网安装教程 Setup 执行如下命令来运行:
1 | $ bin/elasticsearch |
如果上一步的java环境没有安装成功,执行该命令会报如下错误:
1 | Could not find any executable java binary. Please install java in your PATH or set JAVA_HOME |
如果没有出现错误,提示信息中输出 如 [INFO] .....
等信息,说明运行成功。
再新开一个命令行终端,执行:
1 | tiger@vbox:~$ curl http://localhost:9200/ |
出现上面的提示则说明ElasticSearch安装成功。
默认情况下 Elasticsearch
的 RESTful
服务只有本机才能访问。也就是说无法从主机访问虚拟机中的服务。为了方便调试,可以修改 /config/elasticsarch.yml
文件,加入以下两行:
1 | network.bind_host: "0.0.0.0" |
但线上环境切忌不要这样配置,否则任何人都可以通过这个接口修改你的数据。
安装 IK Analysis 处理中文搜索
Elasticsearch 自带的分词器会粗暴地把每个汉字直接分开,没有根据词库来分词。为了处理中文搜索,还需要安装中文分词插件。我使用的是 elasticsearch-analysis-ik,支持自定义词库。
首先,下载与 Elasticsearch 匹配的 elasticsearch-analysis-ik 插件:{2.3.3–1.9.3}
1 | // 从github 下载内容 |
要编译 elasticsearch-analysis-ik
,需要安装 Apache Maven
工具:
1 | sudo apt-get update |
执行编译:
1 | // 当前目录 |
等待直到出现如下提示时,表示编译成功:
1 | [INFO] ------------------------------------------------------------------------ |
发现会多出了一个 target
目录,copy and unzip
目录下的文件 target/releases/elasticsearch-analysis-ik-{version}.zip
到 上面安装的 elasticsearch/plugins/ik
目录中,需要新建 ik
目录:
1 | // target 目录 |
在 elasticsearch-2.3.3/plugins/
下新建目录ik
:
1 | $ ls /elastic/elasticsearch-2.3.3/plugins |
将上面编译完成的 elasticsearch-analysis-ik-1.9.3.zip
拷贝到 ik
目录并解压:
1 | $ cp elasticsearch-analysis-ik-1.9.3.zip ~/elastic/elasticsearch-2.3.3/plugins/ik |
注意:上面的操作目录请根据个人的目录和所下载的版本号进行修改
如果你觉得上面的编译步骤太繁琐,也可以直接在github页面的release
中下载已经编译好的zip文件,直接解压到 ik
目录下即可:
1 | wget -c https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v1.9.3/elasticsearch-analysis-ik-1.9.3.zip |
重启 elasticsearch
服务即可。
如果看到类似于下面的信息,说明 IK Analysis 插件已经装好了:
1 | plugins [analysis-ik] |
如何以root
账户运行elasticSearch
默认情况下,ElasticSearch不允许以root
账户运行,会报 don't run elasticsearch as root.
错误。
不过我们也可以强制让其以 root
账户来运行:
1 | bin/elasticsearch -Des.insecure.allow.root=true |
配置同义词 (该部分待测试)
Elasticsearch 自带一个名为 synonym
的同义词 filter
。为了能让 IK
和 synonym
同时工作,我们需要定义新的 analyzer
,用 IK
做 tokenizer
,synonym
做 filter
。听上去很复杂,实际上要做的只是加一段配置。
打开 ~/elasticsearch-2.3.3/config/elasticsearch.yml
文件,加入以下配置:
1 | index: |
以上配置定义了 ik_syno
和 ik_syno_smart
这两个新的 analyzer
,分别对应 IK
的 ik_max_word
和 ik_smart
两种分词策略。根据 IK
的文档,二者区别如下:
- ik_max_word:会将文本做最细粒度的拆分,例如「中华人民共和国国歌」会被拆分为「中华人民共和国、中华人民、中华、华人、人民共和国、人民、人、民、共和国、共和、和、国国、国歌」,会穷尽各种可能的组合;
- ik_smart:会将文本做最粗粒度的拆分,例如「中华人民共和国国歌」会被拆分为「中华人民共和国、国歌」;
ik_syno 和 ik_syno_smart 都会使用 synonym filter 实现同义词转换。为了方便后续测试,建议创建 ~/elasticsearch-2.3.3/config/analysis/synonym.txt
文件,输入一些同义词并存为 utf-8
格式。例如:
1 | ua,user-agent,userAgent |
用Restful api 测试搜索
(1) 查看集群健康信息:
1 | $ curl -X GET http://localhost:9200/_cat/health?v |
返回结果为:
1 | epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent |
返回结果的主要字段意义:
- cluster:集群名,是在ES的配置文件中配置的cluster.name的值。
- status:集群状态。集群共有green、yellow或red中的三种状态。green代表一切正常(集群功能齐全),yellow意味着所有的数据都是可用的,但是某些复制没有被分配(集群功能齐全),red则代表因为某些原因,某些数据不可用。如果是red状态,则要引起高度注意,数据很有可能已经丢失。
- node.total:集群中的节点数。
- node.data:集群中的数据节点数。
- shards:集群中总的分片数量。
- pri:主分片数量,英文全称为private。
- relo:复制分片总数。
- unassign:未指定的分片数量,是应有分片数和现有的分片数的差值(包括主分片和复制分片)。
我们也可以在请求中添加help参数来查看每个操作返回结果字段的意义。
1 | $ curl -X GET http://localhost:9200/_cat/health?help |
1 | epoch | t,time | seconds since 1970-01-01 00:00:00 |
有了这个东东,就可以减少看文档的时间。ES中许多API都可以添加help参数来显示字段含义,哪些可以这么做呢?每个API都试试就知道了。
当然,如果你觉得返回的东西太多,看着眼烦,我们也可以人为地指定返回的字段。
1 | elasticsearch green 0 |
(2) 查看集群中的节点信息
1 | tiger@vbox:~$ curl -XGET http://localhost:9200/_cat/nodes?v |
返回节点的详细信息如下:
1 | host ip heap.percent ram.percent load node.role master name |
(3) 查看集群中的索引信息
1 | tiger@vbox:~$ curl -XGET http://localhost:9200/_cat/indices?v |
索引(Index)相关API
需要一个索引 index
和 type
(1) 创建一个新的索引
- 使用自定义id索引文档
使用PUT
请求创建一个索引为twitter
类型为tweet
的文档。其文档编号为1
,文档内容包含title
和content
:
1 | tiger@tiger-vbox:~$ curl -XPUT 'http://localhost:9200/twitter/tweet/1?pretty' -d '{ |
返回信息
1 | { |
再添加一篇:
1 | $ curl -XPUT 'http://localhost:9200/twitter/tweet/2?pretty' -d '{ |
返回结果:
1 | tiger@vbox:~$ curl -XPUT 'http://localhost:9200/twitter/tweet/2?pretty' -d '{"title":"范冰冰着花裙亮相青岛,侧颜精致","content":"6月19日,范冰 冰现身青岛某活动,一身花裙甜美亮相,精致侧颜秒杀菲林。"}' |
查看所有文章:
1 | $ curl -XGET 'http://localhost:9200/twitter/tweet/_search?pretty=true' -d '{"query":{"match_all":{}}}' |
返回结果:
1 | { |
这样会把刚才添加的文章都列出来。
搜索关键词“无线”:
1 | tiger@vbox:~$ curl -XGET "http://localhost:9200/twitter/tweet/_search?pretty=true" -d '{"query":{"query_string":{"query":"无线"}}}' |
1 | { |
检查ik的切词效果,可以执行:
1 | tiger@tiger-vbox:~$ curl 'http://localhost:9200/twitter/_analyze?analyzer=ik_max_word&pretty=true' -d '{"text":"中华人民共和国国歌"}' |
返回结果:
1 | { |
说明一下
pretty
参数就是让返回的json有换行和缩进,容易阅读,调试时可以加上,开发到程序里就可以去掉了。
相关链接
依赖包
Linux下安装
- 使用 Elasticsearch 实现博客站内搜索 | JerryQu 的小站 ☆
- 教你成为全栈工程师(Full Stack Developer) 二十四-ES(elasticsearch)搜索引擎安装和使用 - SharEDITor - 关注大数据技术
- Running as a Service on Linux | Elasticsearch Reference [2.3] | Elastic
- The Elastic Stack Download · Get Started in Minutes | Elastic
Windows下安装
- windows下安装elasticsearch-1.7.1 | 教程网
- Running as a Service on Windows | Elasticsearch Reference [2.3] | Elastic
- Windows下安装Maven参考
Restful Api
- Python Elasticsearch api - letong - 博客园
- ElasticSearch教程(4)——ElasticSearch基于REST的CRUD API - 为程序员服务
- 实时搜索引擎Elasticsearch(2)——Rest API的使用 - HinyLover的专栏 - 博客频道 - CSDN.NET
- Document APIs | Elasticsearch Reference [2.3] | Elastic
- elasticsearch rest api 快速上手 · Issue #5 · sxyx2008/elasticsearch · GitHub
文档
- Elasticsearch - 随笔分类 - xingoo - 博客园
- 使用Python进行Elasticsearch数据索引 | Silent River
- 安装和使用 Elasticsearch | vpsee.com
- 实时搜索引擎Elasticsearch(1)——基础概念、安装和运行 - HinyLover的专栏 - 博客频道 - CSDN.NET ☆
- Introduction | Elasticsearch权威指南(中文版) ☆
- AAAAAAA
- https://github.com/medcl/elasticsearch-analysis-ik
- http://blog.csdn.net/xialei199023/article/details/48085125
- http://blog.csdn.net/xialei199023/article/details/48227247
- https://github.com/elastic/elasticsearch
- https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html
- https://github.com/sxyx2008/elasticsearch/issues/5
- http://www.shareditor.com/blogshow/?blogId=36