ElasticSearch中的主要概念
- 索引(index,对应数据库或者数据表)
- 文档(document,对应数据数据库中的一条数据)
- 字段(field,对应数据库中的列)
- 类型(type,每个索引中都可以由一个、多个type,type是index中的一个逻辑数据分类,一个type下的document都有相同的field,ES官方将在9.0版本后摒弃这个概念)
- 分片(shard,索引中数据量过大时,可以将索引中的数据分成多个分片,存储在服务器上,支持海量数据的高并发,提升性能和吞吐量)
- 副本(replica,在分布式的环境下,机器有可能发生宕机,就会导致索引无法搜索,所以为了保证数据的安全、可用,会将每个索引的分片进行备份存储在另外机器,能正常提供查询的叫做主分片、其余的备份分片叫做副分片)
docker拉取elasticsearch
# 拉取镜像 这里使用的是7.3.0版本
docker pull elasticsearch:7.3.0
docker运行容器
数据卷路径要对应的上
docker run -d --name=elastic \
-p 9200:9200 \
-p 9300:9300 \
-v /usr/local/docker/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /usr/local/docker/es/config/jvm.options:/usr/share/elasticsearch/config/jvm.options \
-v /usr/local/docker/es/config/log4j2.properties:/usr/share/elasticsearch/config/log4j2.properties \
-v /usr/local/docker/es/data:/usr/share/elasticsearch/data \
-v /usr/local/docker/es/plugins:/usr/share/elasticsearch/plugins \
-v /usr/local/docker/es/logs:/usr/share/elasticsearch/logs \
elasticsearch:7.3.0
可视化页面elasticsearch-hq
拉取镜像
# 拉取镜像
docker pull elastichq/elasticsearch-hq
运行镜像
# 运行镜像
# link"连接两个容器使其通信,”elastic“要链接的容器名称,”es“为连接容器起的别名
docker run -p 9800:9800 -di --name=elasticHD --link elastic:es containerize/elastichd
常见问题及解决方案:
elasticsearch启动失败:
具体情况具体分析,查看日志:
# 查看日志
docker logs containerId
# 重启服务
docker restart containerId
# 查看是否启动成功
docker ps -a
通常可能的原因,缺少配置、配置路径错误:
# 集群名称
cluster.name: my-application
# 节点名称
node.name: node-1
# 确保文件在”容器中“指定路径
path.data: /usr/share/elasticsearch/config/data
path.logs: /usr/share/elasticsearch/config/logs
Head无法连接elasticsearch服务
可能是elasticsearch服务没有配置跨域,或者没有设置初始化节点,如下是我的配置:
# 指定用于存储数据的路径
path.data: /usr/share/elasticsearch/config/data
# 指定日志文件存储路径
path.logs: /usr/share/elasticsearch/config/logs
# 指定用于发现新节点的主机、地址。
discovery.seed_hosts: ["WIN-QUSP153CQHT", "192.168.1.1"]
# 集群名称
cluster.name: supermarket
# 节点名称
node.name: elasticsearch
# 允许接受所有请求
network.host: 0.0.0.0
# 初始主节点
cluster.initial_master_nodes: ["elasticsearch"]
#开启跨域支持
http.cors.enabled: true
# 允许所有人跨域访问
http.cors.allow-origin: "*"
# 为了安全起见,防止恶意删除索引,删除时必须指定索引名
action.destructive_requires_name: true
分词器
IK分词器
elasticsearch中创建文件架 /plugins/ik (与config同级创建)
# 创建文件夹
mkdir -p plugins/ik
# 权限
chmod -R 777 plugins/
将ik中所有的文件、文件夹放入其中
重启服务
# 重启服务
docker restart containerId
head页面测试
# 分词粒度很小
{
"analyzer": "ik_max_word",
"text": "辽宁省沈阳市铁西区劳动公园"
}
# 粒度较粗
{
"analyzer": "ik_smart",
"text": "辽宁省沈阳市铁西区劳动公园"
}
自定义词库-> plugins/ik/config/IKANalyzer.cfg.xml
ES7的SQL操作
# SQL请求
post /_sql_?format=csv
# json
{
"query":"select * from index",
"filter":{
"range": {
"red":{
"it":100
}
}
}
}
# 返回格式
# csv、json、tsv、txt、cbor、smile
# it小于、gt大于
底层查询步骤
- 分词、自定义词库
- 重建倒排索引(同义词mom\mother)
- 搜索
使用步骤
- 创建索引
- 为索引创建Mapping映射
- 搜索
Mapping核心数据类型
- String: text and keyword
- byte、short、integer、long、float、double
- boolean
- date
- 详细:Field datatypes | Elasticsearch Guide [7.3] | Elastic
当没有手动配置Mapping映射时,索引会自动配置映射。根据字段值推测对应的数据类型。
手动配置Mapping
查看Mapping映射
get index/_mapping/
查看所有索引映射
get /_mapping/
创建映射
就像是Java一样,创建了类接下来就要提供属性。创建索引之后,也应该立即创建映射。
# 请求
put article/_mapping
# Json
{
"properties":{
"title":{
"type":"text",
"analyzer":"ik_max_word",
"search_analyzer":"ik_smart"
},
"content":{
"type":"text",
"analyzer":"ik_max_word",
"search_analyzer":"ik_smart"
},
"types":{
"type":"keyword"
},
"read":{
"type":"integer"
}
}
}
SpringBoot整合ES
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
配置
# 9200 http协议 9300 TCP协议
spring:
elasticsearch:
rest:
uris: http://47.96.255.59:9200/
实体类
Spring Data通过注解声明字段的映射属性,下面三个注解:
- @Document作用在类,标记实体类为文档对象
- 一般有四个属性
- type: 对应索引库中的类型
- indexName: 对应索引库的名称
- shards:分片数量,默认为5
- replicas: 副本数量,默认为1
- @Id作用在成员变量,标记字段为主键
- @filed作用在成员变量,标记为文档的字段,并指定字段映射属性
- 一般也有四个
- type: 字段类型,取值是枚举:FieldType
- index:是否索引,布尔类型,默认是true
- store:是否存储,布尔类型,默认是false
- anllyzer:分词器名称- ik_max_word