ElasticSearch使用笔记
Es存储数据原理:倒排索引
将存放的数据,以一定的方式进行分词,并且将分词的内容存放到一个单独的分词库中。
当用户去查询数据时,会将用户的查询关键字进行分词。
然后去分词库中匹配内容,最终得到数据的id标识。
根据id标识去存放数据的位置拉取到指定的数据。
ElasticSearch安装
windows安装参考视频,剩余内容在资料中
安装ES&Kibana
docker-compose.yml文件
version: "3.1"
services:
es:
image: daocloud.io/library/elasticsearch:7.6.2
restart: always
container_name: es
ports:
- 9200:9200
environment:
- discovery.type=single-node
kibana:
image: daocloud.io/library/kibana:7.6.2
restart: always
container_name: kibana
environment:
- elasticsearch_url=http://192.168.200.129:9200
ports:
- 5601:5601
depends_on:
- es安装出现的问题:
启动es最大虚拟内存不足:
进入docker容器中操作。 docker exec -it daocloud.io/library/elasticsearch:7.6.2 bash #修改文件 vi /etc/sysctl.conf #设置ES最大虚拟内存大小 vm.max_map_count=655360 #让设置生效 sysctl -p启动es时,持久化数据的数据卷没有权限修改:
# 修改数据卷目录的权限 chmod 777 data启动kibana报错pid: "6":
# 进去kibana容器 docker exec -it kibana bash # 修改config目录下的kibana.yml vi config/kibana.yml # 更改两个地方: # 将elasticsearch:9200替换为es容器的id地址:9200 # 将最后的true,改为false
# ** THIS IS AN AUTO-GENERATED FILE **
# Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://192.168.200.129:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: false先执行docker-compose restart
先访问9200,再访问5601
安装IK分词器
进去到ES容器内部,跳转到 bin 目录下,执行 bin 目录下的脚本文件:
./elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.2/elasticsearch-analysis-ik-7.6.2.zip
重启ES的容器,让IK分词器生效。
浏览器访问Kabana:
使用Kabana测试Ik分词器效果:
POST _analyze
{
"analyzer": "ik_max_word",
"text": "中华人民共和国"
}
操作ES的RESTful语法
注意 :基于7.x版本的ElasticSearch, 所以没有type
GET请求:
http://ip:port/index:查询索引信息
http://ip:port/index/type/doc_id:查询指定的文档信息
POST请求:
http://ip:port/index/type/_search:查询文档,可以在请求体中添加json字符串来代表查询条件
http://ip:port/index/type/doc_id/_update:修改文档,在请求体中指定json字符串代表修改的具体信息
PUT请求:
http://ip:port/index:创建一个索引,需要在请求体中指定索引的信息,类型,结构
http://ip:port/index/type/_mappings:代表创建索引时,指定索引文档存储的属性的信息
DELETE请求:
http://ip:port/index:删除索引
http://ip:port/index/type/doc_id:删除指定的文档
ES中Field可以指定的类型
字符串类型:
text:一般被用于全文检索。 将当前Field进行分词。 不支持聚合查询.
keyword:当前Field不会被分词。只能精确查询, 不能全文检索查询, 支持聚合查询.
数值类型:
long:取值范围为-9223372036854774808~922337203685477480(-2的63次方到2的63次方-1),占用8个字节
integer:取值范围为-2147483648~2147483647(-2的31次方到2的31次方-1),占用4个字节
short:取值范围为-32768~32767(-2的15次方到2的15次方-1),占用2个字节
byte:取值范围为-128~127(-2的7次方到2的7次方-1),占用1个字节
double:1.797693e+308~ 4.9000000e-324 (e+308表示是乘以10的308次方,e-324表示乘以10的负324次方)占用8个字节
float:3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方,e-45表示乘以10的负45次方),占用4个字节
half_float:精度比float小一半。
scaled_float:根据一个long和scaled来表达一个浮点型,long-345,scaled-100 -> 3.45
时间类型:
date类型,针对时间类型指定具体的格式
布尔类型:
boolean类型,表达true和false
二进制类型:
binary类型暂时支持Base64 encode string
范围类型:
long_range:赋值时,无需指定具体的内容,只需要存储一个范围即可,指定gt,lt,gte,lte
integer_range:同上
double_range:同上
float_range:同上
date_range:同上
ip_range:同上
经纬度类型:
geo_point:用来存储经纬度的
ip类型:
ip:可以存储IPV4或者IPV6
小结 :常用需要记住的内容如下 :
字符串类型:
keyword:不能被分词
text:可以被分词
数值类型:
整形:byte,short,integer,long
浮点型:float,double
时间类型:
date:可以给date类型指定format格式化,支持时间戳以及年月日等格式
IP类型:
存储ip
GEO_POINT类型:
存储经纬度
Ps官网文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.6/mapping-types.html
java操作ES
import com.fasterxml.jackson.databind.ObjectMapper;
import com.qf.utils.EsClient;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.Test;
import pojo.Person;
import java.io.IOException;
import java.util.Date;
/**
* @author tuneinyang
*/
public class TestSimple {
//json转换工具对象
private ObjectMapper mapper = new ObjectMapper();
//es连接
private RestHighLevelClient client = EsClient.getClient();
//索引名字
private String index = "person";
/**
* 添加文档, 存入数据
* @throws IOException
*/
@Test
public void testCreateDoc() throws IOException {
//1. 准备一个person数据
Person person = new Person("1", "张三", 23, new Date());
//2. 将person实体转换成json格式
String json = mapper.writeValueAsString(person);
//3. 准备一个request对象, 指定索引名字(手动指定id)
IndexRequest request = new IndexRequest(index);
//4. 手动指定id, 将json数据存入请求对象中, XContentType.JSON为存入数据类型
request.id(person.getId()).source(json, XContentType.JSON);
//5. 通过client对象执行添加
IndexResponse resp = client.index(request, RequestOptions.DEFAULT);
//6. 输出返回结果
System.out.println(resp.getResult().toString());
}
}