全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。
Elastic 的底层是开源的Lucene。Elastic提供了REST API的操作接口。是Lucene的扩展。底层依旧是索引,但是可以把大索引切成n片,放到不同的节点,所以就实现了分布式。也就理所当然的是读写负载均衡。此外,他还是一个分布式实时文档存储,其中每个field可被搜索。 ES 可以自动将海量数据分布到多台服务器上去存储和检索海量数据。可以在秒级别在每台服务器上分析数据。
下面简单的介绍一下Elastic并且从零开始搭建一个Elastic。
基本组件: (1).索引(index):文档容器,类似于关系型数据库中的库。索引名必须是小写字母。
(2).类型(type):类型是索引内部的逻辑分区。其意义完全取决与用户需求,一个索引内部可定义多个类型。类似于关系型数据库中的表结构,字段。
(3).文档(document):文档是Lucene索引和搜索的原子单位。它包含多个域。基于JSON格式存储。每个域的格式类似于字典
(4).映射(mapping):原始内容存储为文档之前的分析,映射就是定义此映射过程该如何实现。(例如切词,过滤)
集群组件:(1)Cluster:ES的集群标识为集群名称。默认为“elasticsearch”,节点靠此名字决定加入到哪一个集群中。一个节点只能属于一个集群。
(2).Node:运行单个ES实例的主机。节点的标识靠节点名。
(3).Shard:将索引切割成为的物理存储组件,但每一个shared都是一个独立且完整的索引,创建索引时,ES默认分割为5个shard。用户也可以按需自定义,创建完成后不可修改。shard有两种,primary和replica。用于负载均衡。
ES Cluster启动过程。通过多播(或单播)在9300/tcp查找同一集群中的其他节点,并建立通信。集群中所有节点会选举出一个主节点负责管理整个集群状态。以及在集群范围内决定shared的分布。
安装环境 Linux centos7.3 3台. 直接就安装成集群。Elastic 的安装需要Java环境。不会配置Java环境的请参考这篇文章
这里也简单的演示一下JAVA的环境配置。首先准备好jdk的tar包。下载网页
# mkdir /usr/java
# tar xf jdk-8u151-linux-i586.tar.gz -C /usr/java
# vim /etc/profile
JAVA_HOME=/usr/java/jdk1.8.0_151
export JRE_HOME=/usr/java/jdk1.8.0_151/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
# update-alternatives --install /usr/bin/java java /usr/java/jdk1.8.0_151/bin/java 300
# update-alternatives --install /usr/bin/javac javac /usr/java/jdk1.8.0_151/bin/javac 300
# update-alternatives --config java
共有 3 个程序提供“java”。
选择 命令
-----------------------------------------------
*+ 1 /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
2 /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
3 /usr/java/jdk1.8.0_151/bin/java
按 Enter 来保存当前选择[+],或键入选择号码:3
若出现 -bash: /usr/java/jdk1.8.0_151/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录 这个错误, 则执行 yum install glibc.i686 即可。
至此,安装成功jdk。下来安装Elasticsearch。下载页面
下载好rpm包。执行
# rpm -ivh elasticsearch-6.1.1.rpm
warning: elasticsearch-6.1.1.rpm: Header V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Preparing... ########################################### [100%]
Creating elasticsearch group... OK
Creating elasticsearch user... OK
1:elasticsearch ########################################### [100%]
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using chkconfig
sudo chkconfig --add elasticsearch
### You can start elasticsearch service by executing
sudo service elasticsearch start
启动Elasticsearch。
# systemctl start elasticsearch
接下来修改配置文件。
# vim /etc/elasticsearch/elasticsearch.yml
cluster.name: my-elastic
# 集群名字,相同集群名字的节点会放到同一个集群下
node.name: "node-1"
# 节点名字
discovery.zen.minimum_master_nodes: 2
#指定集群中的节点中有几个有master资格的节点。
#对于大集群可以写3个以上。
discovery.zen.ping.timeout: 3s
#默认是3s,这是设置集群中自动发现其它节点时ping连接超时时间
discovery.zen.ping.multicast.enabled: false
#设置是否打开多播发现节点,默认是true。
network.bind_host: 192.168.40.129
#设置绑定的ip地址,这是我的虚拟机的IP。
network.publish_host: 192.168.40.129
#设置其它节点和该节点交互的ip地址。
network.host: 0.0.0.0
#同时设置bind_host和publish_host上面两个参数。
transport.tcp.port: 9300
#设置参与集群的端口
http.port: 9200
#接收请求端口
#discovery.zen.ping.unicast.hosts:["节点1的 ip","节点2 的ip","节点3的ip"]
#指明集群中其它可能为master的节点ip,以防es启动后发现不了集群中的其他节点。
启动后,发现9200,9300端口处于监听状态。 如果发现,network.host不能绑定到0.0.0.0上。(一启动就出错,则可能的原因如下)
接下来给其余的两个节点同样的步骤安装Elasticsearch。
{
"id" : "qWAEoJU",
"product_name" : "蒂花之秀",
"product_desc" : "乌黑亮丽",
"category" : "2",
"category_name" : "日化用品"
}
# pwd
/usr/share/elasticsearch/bin
# ls
elasticsearch elasticsearch-env elasticsearch-keystore elasticsearch-plugin elasticsearch-translog
这些命令是es的插件,日志等管理工具。plugins 是放es相关插件的。
# yum -y install kibana-6.1.1-x86_64.rpm
安装完成后、可简单修改其配置文件 /etc/kibana/kibana.yml 改变其监听端口(默认是localhost)。
curl -X GET localhost:9200/_cat/indices
(2)、创建索引。
# curl -X PUT localhost:9200/test_index?pretty
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "test_index"
}
(3)、删除索引。
# curl -X DELETE localhost:9200/test_index?pretty
{
"acknowledged" : true
}
PUT /ecommerce/product/1
{
"name" : "xiaomi6",
"desc" : "wei fashao ersheng",
"price" : "2300",
"producer" : "xiaomi keji",
"tags" : ["heikeji","fashao"]
}
PUT /ecommerce/product/2
{
"name" : "iphoneX",
"desc" : "gaoduan daqi",
"price" : "8300",
"producer" : "apple",
"tags" : ["qianwei","shishang"]
}
二、检索商品。
# curl -XGET localhost:9200/ecommerce/product/1
{"_index":"ecommerce","_type":"product","_id":"1","_version":1,"found":true,"_source":{
"name" : "xiaomi6",
"desc" : "wei fashao ersheng",
"price" : "2300",
"producer" : "xiaomi keji",
"tags" : ["heikeji","fashao"]
}
POST /ecommerce/product/1/_update
{
"doc":{
"price": "2400"
}
}
四、删除商品
DELETE /ecommerce/product/1
GET ecommerce/product/_search
查询结果:
{
"took": 90,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1,
"hits": [
{
"_index": "ecommerce",
"_type": "product",
"_id": "2",
"_score": 1,
"_source": {
"name": "iphoneX",
"desc": "gaoduan daqi",
"price": "8300",
"producer": "apple",
"tags": [
"qianwei",
"shishang"
]
}
},
{
"_index": "ecommerce",
"_type": "product",
"_id": "1",
"_score": 1,
"_source": {
"name": "xiaomi6",
"desc": "wei fashao ersheng",
"price": "2400",
"producer": "xiaomi keji",
"tags": [
"heikeji",
"fashao"
]
}
}
]
}
}
GET /ecommerce/product/_search?q=name:xiaomi
GET /ecommerce/product/_search
{
"query" : {
"match" : {
"name" :"xiaomi"
}
}
}
分页查询商品,总共3条商品。假设每页就显示一条。现在显示第2页。
GET ecommerce/product/_search
{
"query":{
"match_all": {}},
"from":1,
"size":1
}
只查出名称和价格
GET ecommerce/product/_search
{
"query":{
"match_all": {}
},
"_source": ["name","price"]
}
GET ecommerce/product/_search
{
"query":{
"bool":{
"must":{
"match":{
"name":"xiaomi"
}
},
"filter":{
"range":{
"price":{
"gt": 2000
}
}
}
}
}
}
短语搜索,与全文搜索相对应。短语搜索是必须匹配。
GET ecommerce/product/_search
{
"query":{
"match_phrase":{
"producer": "keji"
}
}
}
搜索高亮显示。
GET ecommerce/product/_search
{
"query":{
"match":{
"producer": "keji"
}
},
"highlight": {
"fields": {
"producer": {}
}
}
}
Detect languageAfrikaansAlbanian ArabicArmenian AzerbaijaniBasqueBelarusian BengaliBosnian BulgarianCatalanCebuano ChichewaChinese (Simplified) Chinese (Traditional)Croatian CzechDanishDutch EnglishEsperantoEstonian FilipinoFinnishFrench GalicianGeorgianGerman GreekGujaratiHaitian Creole HausaHebrew HindiHmongHungarian IcelandicIgboIndonesian IrishItalianJapanese JavaneseKannadaKazakh KhmerKoreanLao LatinLatvianLithuanian MacedonianMalagasyMalay MalayalamMalteseMaori MarathiMongolianMyanmar (Burmese) NepaliNorwegian PersianPolishPortuguese PunjabiRomanianRussian SerbianSesothoSinhala SlovakSlovenianSomali SpanishSundaneseSwahili SwedishTajikTamil TeluguThaiTurkish UkrainianUrduUzbek VietnameseWelshYiddish YorubaZulu | AfrikaansAlbanianArabic ArmenianAzerbaijaniBasque BelarusianBengali BosnianBulgarianCatalan CebuanoChichewaChinese (Simplified) Chinese (Traditional)Croatian CzechDanish DutchEnglish EsperantoEstonianFilipino FinnishFrench GalicianGeorgianGerman GreekGujaratiHaitian Creole HausaHebrew HindiHmongHungarian IcelandicIgboIndonesian IrishItalianJapanese JavaneseKannadaKazakh KhmerKoreanLao LatinLatvianLithuanian MacedonianMalagasyMalay MalayalamMalteseMaori MarathiMongolianMyanmar (Burmese) NepaliNorwegian PersianPolishPortuguese PunjabiRomanianRussian SerbianSesothoSinhala SlovakSlovenianSomali SpanishSundaneseSwahili SwedishTajikTamil TeluguThaiTurkish UkrainianUrduUzbek VietnameseWelshYiddish YorubaZulu |
Options :History :Feedback :Donate | Close |