ElasticSearch
概述:
学习,从百度开始。 以下是Elasticsearch百度百科的介绍,如果已经了解,可以跳过。
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。
Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。
Elasticsearch 的实现原理主要分为以下几个步骤,首先用户将数据提交到Elasticsearch 数据库中,再通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据,当用户搜索数据时候,再根据权重将结果排名,打分,再将返回结果呈现给用户。
Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)。
下载安装
1、安装ElasticSearch
在安装Elasticsearch引擎之前,必须安装所需要的软件环境,安装Java JDK和配置JAVA_HOME环境变量,Elasticsearch5.0以上版本需要安装jdk1.8,其他版本安装jdk1.7即可。
访问官网的下载地址:https://www.elastic.co/downloads/elasticsearch,windows版的下载ZIP格式。
如果不想下载最新版,可以点击“past releases”选择过去的版本。我用的是7.6.1
下载好之后解压,解压之后会出现elasticsearch-7.6.1
文件夹
进入到bin目录,双击elasticsearch.bat
,该脚本文件执行 ElasticSearch 安装程序,稍等片刻。
打开浏览器,输入 http://localhost:9200 ,显式以下画面,说明ES安装成功。
配置文件:
配置文件在安装目录下的config
文件夹中
elasticsearch.yml : 用于配置Elasticsearch运行参数
jvm.options : 用于配置Elasticsearch JVM设置
log4j2.properties: 用于配置Elasticsearch日志
我的elasticsearch.yml
配置如下:
cluster.name: qixx
node.name: qxx_node_01
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301"]
discovery.zen.minimum_master_nodes: 1
node.ingest: true
bootstrap.memory_lock: false
node.max_local_storage_nodes: 2
http.cors.enabled: true
http.cors.allow-origin: "*"
path.data: D:\ElasticSearch\elasticsearch-7.6.1\data
path.logs: D:\ElasticSearch\elasticsearch-7.6.1\logs
注意path.data和path.logs路径要配置正确。
常用的配置项如下:
cluster.name: 配置elasticsearch的集群名称,默认是elasticsearch。建议修改成一个有意义的名称。
node.name: 节点名,通常一台物理服务器就是一个节点,es会默认随机指定一个名字,建议指定一个有意义的名称,方便管 理
path.conf: 设置配置文件的存储路径,tar或zip包安装默认在es根目录下的config文件夹,rpm安装默认在/etc/ elasticsearch
path.data: 设置索引数据的存储路径,默认是es根目录下的data文件夹,可以设置多个存储路径, 用逗号隔开。
path.logs: 设置日志文件的存储路径,默认是es根目录下的logs文件夹
path.plugins: 设置插件的存 放路径,默认是es根目录下的plugins文件夹
bootstrap.memory_lock: true 设置为true可以锁住ES使用的内存,避免内存与swap分区交换数据。
network.host: 设置绑定主机的ip地址,设置为0.0.0.0表示绑定任何ip,允许外网访问,生产环境建议设置为具体 的ip。
http.port: 9200 设置对外服务的http端口,默认为9200。
transport.tcp.port: 9300 集群结点之间通信端口
node.master: 指定该节点是否有资格被选举成为master结点,默认是true,如果原来的master宕机会重新选举新 的master。
node.data: 指定该节点是否存储索引数据,默认为true。
discovery.zen.ping.unicast.hosts: [“host1:port”, “host2:port”, “…”] 设置集群中master节点的初始列表。
discovery.zen.ping.timeout: 3s 设置ES自动发现节点连接超时的时间,默认为3秒,如果网络延迟高可设置大些。 discovery.zen.minimum_master_nodes: 主结点数量的最少值 ,此值的公式为:(master_eligible_nodes / 2) + 1 ,比如:有3个符合要求的主结点,那么这 里要设置为2。
node.max_local_storage_nodes: 单机允许的最大存储结点数,通常单机启动一个结点建议设置为1,开发环境如果单机启动多个节点可设置大于1.
安装ElasticSearch-Head插件
Elasticsearch-head 是用于监控 Elasticsearch 状态的客户端插件,包括数据可视化、执行增删改查操作等,比较好用。
下载地址:elasticsearch-head,点击clone or download按钮,点击download zip进行下载。下载完毕后解压到任意路径上,别放在elasticsearch安装路径上。
安装Node.js
下载地址:node.js
安装grunt
运行head需要借助grunt命令,因此需要安装grunt。
打开cmd,输入命令 cd D:\Nodejs(你安装nodejs的路径) 进入Nodejs的根目录下。
输入npm install -g grunt -cli
进行安装grunt。
安装pathomjs
输入命令 cd D:\head
(你安装head的路径) 进入head的根目录下,然后执行命令:npm install
进行安装pathomjs
。
安装完成之后运行命令 grunt server
,启动head服务(默认端口号是9100)。
用head访问elasticsearch浏览器访问http://localhost:9100 ;
进去之后点击连接,如果没反应可能是跨域问题, 打开D:\ElasticSearch\elasticsearch-7.6.1\config\elasticsearch.yml
在末尾加上下面两句
#开启cors跨域访问支持
http.cors.enabled: true
#跨域访问允许的域名地址,(允许所有域名)以上使 用正则 http.cors.allow-origin: /.*/
http.cors.allow-origin: "*"
至此,准备工作基本做完了。
创建索引库
ES 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。所以,ES 数据管理的顶层单位就叫做 Index(索引)。
ES的索引库是一个逻辑概念,它包括了分词列表及文档列表,同一个索引库中存储了相同类型的文档。
6.0之前的版本有type(类型)概念,type相当于关系数据库的表,ES官方将在ES7.0版本中彻底删除type。去掉了它就相当于 MySQL中的表。
1)、可以直接可视化界面创建
2)、发送put请求进行创建
这里使用的是postman工具
PUT请求:http://localhost:9200/索引库名称
在Body中添加:
{
"settings":{
"index":{
"number_of_shards":1,
"number_of_replicas":0
}
}
}
number_of_shards: 设置分片的数量,在集群中通常设置多个分片,表示一个索引库将拆分成多片分别存储不同 的结点,提高了ES的处理能力和高可用性,因为使用单机环境,这里设置为1。
number_of_replicas: 设置副本的数量,设置副本是为了提高ES的高可靠性,单机环境设置为0.
副本分片的主要目的是为了故障转移。
(1)故障转移/集群恢复
如果持有主分片的节点挂了,一个副本分片就会晋升为主分片 在索引写入时,副本分片做着与主分片相同的工作。新文档首先被索引进主分片然后再同步到其它所有的副本分片。增加副本数并不会增加索引容量。
(2)通过副本进行负载均衡
搜索性能取决于最慢的节点的响应时间,所以尝试均衡所有节点的负载是一个好想法。 如果我们只是增加一个节点而不是两个,最终我们会有两个节点各持有一个分片,而另一个持有两个分片做着两倍的工作。
创建映射
所有文档写进索引之前都会先进行分析,如何将输入的文本分割为词条、哪些词条又会被过滤,这种行为叫做映射(mapping)。一般由用户自己定义规则。
在索引中每个文档都包括了一个或多个字段,创建映射就是向索引库中创建字段的过程。
- 文档(Document)-- 在关系型数据库中相当于-- Row记录
- 字段(Field)-- 在关系型数据库中相当于-- Columns 列
创建:
POST请求 : http://localhost:9200/索引库名称/_mapping
此处演示创建类型为qxx_store的映射,共包括三个字段:name、details、code
{
"properties": {
"name": {
"type": "text"
},
"details": {
"type": "text"
},
"code": {
"type": "keyword"
}
}
}
type后面的text表示支持分词,全文检索,支持模糊、精确查询,不支持聚合,排序操作;
keyword表示不进行分词,直接索引,支持模糊、支持精确匹配,支持聚合、排序操作。
创建文档
存储在ES中的一条数据即是一个文档,类似数据库的一行数据。ES会索引每个文档的内容,以便搜索。
它使用的JSON格式。即我们将数据存储到ES中,实际上是将JSON格式的字符串发给了ES。
创建:
POST/PUT请求:put 或Post http://localhost:9200/索引库名/_doc/id
id可以不指定,如果不指定ES会自动生成id值
{
"name": "ES搜索引擎",
"details": "Elasticsearch是与名为Logstash的数据收集和日志解析引擎以及名为Kibana的分析和可视化平台一起开发的。这三个产品被设计成一个集成解决方案,称为“Elastic Stack”(以前称为“ELK stack”)",
"code": "2020"
}
搜索文档
根据id来查询:
发送GET请求:http://localhost:9200/索引库名/_doc/1
查询名字包含引擎的记录:
{
"query": {
"match": {
"name": "引擎"
}
}
}
响应:
took:耗费了几毫秒。
timed_out:是否超时。
_shards:数据拆成几个分片,对于搜索请求,会打到所有的主分片(primary shard)或者是它的某个副本分片(replica shard)也可以。
hits:查询的所有结果
hits里面的 total:查询结果的数量(多少个 document)
max_score:score的含义就是document对于一个search的相关度的匹配分数,越相关、就越匹配,分数也越高;
hits.hits(hits里面包含了hits):匹配度较高的前 N 个文档
_index:该文档所属的index
_type:该文档所属的type
_id:该文档的id
_source:具体的内容,即存储的json串
ik分词器
下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
你需要根据你对ES的版本来下载对应版本的IK,这里我使用的是7.6.1的版本,所以就下载7.6.1的zip文件。
解压 --> 将文件复制到es的安装目录下的plugin/ik即可。
到这步就已经完成了,不需要去elasticSearch.yml中配置。
重启ElasticSearch。
测试:
发送GET请求:http://localhost:9200/_analyze
{"text":"分词器测试例子:ElaaticSearch","analyzer":"ik_max_word" }
“analyzer”:
1、ik_max_word:会将文本做最细粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民共和国、人民、共和国、大会堂、大会、会堂等词语。
2、ik_smart:会做最粗粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。
响应:
到此ElasticSearch的简单入门例子就结束了。
更多内容详情参照官方文档:https://www.elastic.co/guide/index.html
来源:oschina
链接:https://my.oschina.net/u/4255780/blog/4311221