13
0

ElasticSearch使用笔记

2026-05-12

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分词器

浏览器访问Kabana:

http://192.168.200.129:5601

  • 使用Kabana测试Ik分词器效果:

 POST _analyze
 {
   "analyzer": "ik_max_word",
   "text": "中华人民共和国"
 }


操作ES的RESTful语法

注意 :基于7.x版本的ElasticSearch, 所以没有type

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());
    }
    
}

评论