一、docker部署es
在安装es前,先执行 yum install -y yum-utils device-mapper-persistent-data lvm2 命令,
-
device-mapper-persistent-data:这是 Device Mapper 的一个组件,提供了持久化数据存储功能。这对于 Elasticsearch 数据存储的稳定性和可靠性至关重要。如果没有这些基础组件,在配置和管理 Elasticsearch 的数据存储时可能会受到限制,甚至导致数据丢失或存储管理困难。 -
lvm2:LVM(Logical Volume Manager,逻辑卷管理器)是一种在 Linux 系统中用于灵活管理磁盘空间的技术。LVM 允许系统管理员更灵活地管理磁盘空间。例如,当 Elasticsearch 的数据存储需求增长时,利用 LVM 可以方便地扩展存储卷的大小,而无需重新分区或停机。
拉取es镜像:docker pull elasticsearch:7.3.1
安装es:docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 --restart=always -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" 3d3aa92f641f
- 9200端口:es的api请求默认使用9200端口
- 9300端口:在集群环境下,用于es服务间通信
-e "discovery.type=single - node":单节点部署-e ES_JAVA_OPTS="-Xms1024m -Xmx1024m":通过环境变量设置es运行时JVM的堆内存初始大小(-Xms1024m)和最大大小(-Xmx1024m)均为 1024MB。
二、es相关概念
索引库 -- 对比mysql的数据库
索引 -- 对比mysql的表
文档 -- 对比mysql表中的数据
映射 -- 对比mysql的字段约束
三、Http 调用 es 基础操作
3.1 创建索引
put:http://117.72.118.73:9200/subject_info ip+9200/索引名
3.2 创建索引映射
put:http://117.72.118.73:9200/subject_info/_mapping ip+9200/索引名/_mapping
index为是否创建倒排索引,即字段是否能够被搜索,默认为true; 被搜索时,需要指定分词器analyzer
{
"properties": {
"subject_id": { //字段名
"type":"long", //type:数据类型
"index":true
},
"subject_name":{
"type":"text",
"index":true,
"analyzer":""
},
"subject_answer":{
"type":"text",
"index":"true",
"analyzer":""
}
}
}
3.3 创建文档
post:http://117.72.118.73:9200/subject_index/_doc ip+9200/索引名/_doc
{
"subject_id":1,
"subject_name":"redis是什么",
"subject_answer":"是一种缓存"
}
3.4 查询所有文档
get:http://117.72.118.73:9200/subject_index/_search ip+9200/索引名/_search
{
"took": 1,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 2,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "subject_index",
"_type": "_doc",
"_id": "N-myXpQBgH2t9AyXqPsX",
"_score": 1,
"_source": {
"subject_id": 1,
"subject_name": "redis是什么",
"subject_answer": "是一种缓存"
}
},
{
"_index": "subject_index",
"_type": "_doc",
"_id": "OOm2XpQBgH2t9AyXIfsq",
"_score": 1,
"_source": {
"subject_id": 1,
"subject_name": "mysql是什么",
"subject_answer": "是一个数据库"
}
}
]
}
}
- took:花费时间 ms级别
- timeout:是否超时
- _shards:分片关系
- max_score:查询结果与查询内容的匹配度,越高越精准
- hits:命中结果
- relation:是否准确,eq代表准确,gte不准确
- _source:文档内容
3.5 全文检索查询
get:http://117.72.118.73:9200/subject_index/_search ip+9200/索引名/_search
- 单字段
match查询,对查询内容进行分词,返回与倒排索引库中词条匹配的文档
{
"query":{
"match":{
"subject_name":"mysql哥哥哥" //字段名:查询内容
}
}
}
- 多字段
multi_match查询,对查询内容进行分词,符合其中任意一个字段就算满足查询条件,返回与倒排索引库中词条匹配的文档
{
"query":{
"multi_match":{
"query":"mysql哥哥哥", //"query":查询内容
"fields":["subject_name", "subject_answer"] //"fields":["字段1","字段2"...]
}
}
}
3.6 精确查询
精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。
- term:根据词条精确值查询
{
"query": {
"term": {
"subject_name": "mysql哥哥哥"
}
}
}
因为精确term查询的字段是不分词的字段,因此查询的条件也必须是不分词的词条。查询时,只有用户输入的内容跟字段值完全匹配时才认为符合条件。因此如果用户输入的内容过多,反而搜索不到数据。
- range:根据值的范围查询
范围range查询,一般应用在对数值类型做范围过滤的时候。比如对价格、日期范围过滤,。
{
"query": {
"range": {
"FIELD": {
"gte": number,
"lte": number
}
}
}
}
四、ik分词器
es默认分词器,只支持英文分词,当输入中文时,无法进行识别,会一个字一个字拆分;所以要使用ik分词器,进行中文分词,分词器分的好,搜索的东西才展现的好。
先把ik插件传入服务器,存放任意文件夹内
mkdir /soft/ik -p
进入es容器内部自带的plugins文件夹中,并创建ik文件夹
docker exec -it elasticsearch /bin/bash
cd plugins
mkdir ik
回到外部,把本地的ik文件夹传入容器内
docker cp /soft/ik/. elasticsearch:/usr/share/elasticsearch/plugins/ik
重启es
docker restart elasticsearch
检验分词器接口:http://117.72.118.73:9200/_analyze ip+9200/_analyze
- es原生分词器
{
"analyzer":"standard",
"text":"我是哥哥哥"
}
-
IK分词器包含两种模式:
ik_smart:最少切分,粗粒度,搜索到概率较小但比较节省内存ik_max_word:最细切分,细粒度,搜索到概率更大但比较占用内存
{
"analyzer":"ik_smart",
"text":"我是数据库"
}
{
"analyzer":"ik_max_word",
"text":"我是数据库"
}