ES:分布式全文搜索引擎

Elasticsearch:是一个分布式全文搜索引擎

工作流程 :

  • ES通过分词器 , 分出对应的关键字 ,
  • 用户输入对应的关键字
  • 通过关键字 , 查找对应的所有带有关键字的数据的id值 ,
  • 然后通过这些id值获取到对应的详细数据

概念

描述

索引

是sql中为了加速查询设置的主键 , 根据主键查数据

倒排索引

整个工作就是依靠倒排索引实现的 , 倒排索引是通过一个个的文档先建立倒排索引的库 , 是根据关键字查索引

创建文档

使用文档


下载安装运行ES:

  • 下载
  • 启动:
  • 在bin目录, 双击elasticsearch.bat ,启动即可 , 默认端口号是9200

ES的基本操作:

要想操作ES , 我们发送web请求即可

ES全面支持RESTful这种风格的操作

就是创建一个索引为books的 , 这个索引就相当于数据库中的库一样

索引操作

uri

请求

注意事项

创建索引

http://localhost:9200/books

put请求

携带请求体 , json格式的 , 用来设置分词器 , 使用put是为了它的幂等性

查看索引

http://localhost:9200/books

get请求

不能携带请求体

操作索引

http://localhost:9200/books/_doc/1

post请求

不能携带请求体 , 后边的id就是指定的文档

删除索引

http://localhost:9200/books

delete请求

不能携带请求体

{
    "acknowledged": true,  //这个就是表示本次操作成功
    "shards_acknowledged": true,
    "index": "books"  //这个就是索引的名称 books , 
    //注意这个索引的名称是不允许重复的 , 
}

  • 使用ES还要下载ik分词器插件
  • 地址 : https://github.com/medcl/elasticsearch-analysis-ik/releases
  • 将下载后的插件放在ES目录下的plugins文件夹
  • ik分词器是一个插件 , 要想使用要重新启动ES

在创建索引的时候 , 在请求体中设置一组值

{
    "mappings":{
        "properties":{
            "id":{ 
                "type":"keyword" //这个值指的是ES的类型 , 设置这个属性是关键字
                //不让按照这个属性查询 : "index":"false"
            },
            "name":{
                "type":"text", //告诉ES这个字段提供的是文本信息 , 可以被分词
                "analyzer":"ik_max_word", //表示分词器 , 也就是这个字段要进行分词
                "copy_to":"all" //表示接收到name这个信息之后  , 不止在name中保存信息 , 同时将其拷贝到all这个虚拟属性中 , 
                //这么做是因为 : 如果输入一个 spring字段 , 这个字段是在name中查找还是在address中查找  , 只能在一个属性中查找  , 但是我们希望的是 , 不管是name中还是address中带有spring这个字段 , 都可以查到 , 所以 , 我们要将name和address中的信息组成一个整体 , 也就是下边的all属性字段
            },
            "address":{
                "type":"text",
                "analyzer":"ik_max_word",
                "copy_to":"all"
            },
            "description":{
                "type":"text",
                "analyzer":"ik_max_word"
            },
            //这个属性是一个虚拟的 , 可以随便起名字 , 在上边指定的 "copy_to":"all" 属性 , 主要用于查询的 , 包含了name和address的所有信息 , 在查询的时候 , 就可以同时查找name,address中带有spring的所有信息 
            "all":{   
                "type":"text",
                "analyzer":"ik_max_word"
            }
        }
    }
}

ES文档操作 :

添加文档 :

文档操作

格式

请求

注意事项

添加文档

http://localhost:9200/books/_create/2

post请求

记得指定id,不然会使用默认的id,是一个长字符串,同时记得在请求体中添加json格式的文档数据

添加文档

http://localhost:9200/books/_doc/3

post请求

同上

查看文档数据

http://localhost:9200/books/_doc/3

get请求

注意 , 这里不能使用_create , 只能使用_doc

查看所有文档数据

http://localhost:9200/books/_search

get请求

这里使用的不是_doc , 而是_search

按照分词进行查询

http://localhost:9200/books/_search?q=name:思尘

get请求

这里使用的不是_doc , 而是_search

按照id删除文档

http://localhost:9200/books/_doc/3

delete请求

这里使用的也是_doc

按照id修改文档(全量修改)

http://localhost:9200/books/_doc/3

put请求

这里使用的也是_doc , 要携带json类型的值 , 可以只携带一条数据 , 其他没有设置值的属性就会被抹掉 , 并且每修改一次 , 它的版本号会加一

按照id修改文档(修改单个属性,不进行覆盖)

http://localhost:9200/books/_update/3

post请求

携带的数据要以"doc":{}包裹 , 就可以指定修改对应的数据 , 而不覆盖整个内容 , 版本号会加一


SpringBoot整合ES操作 :

低级别的 : low level Client

  • 导入对应坐标 :
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
  • 编辑对应的配置 :
elasticsearch:
  rest:
    uris: http://localhost:9200
  • 导入对应的Template
@Autowired
private ElasticsearchRestTemplate restTemplate;

高级别的 : high level Client

  • 导入对应的依赖 :
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
  • 编辑配置 :
//SpringBoot只提供了低版本的配置 , 高版本的没有做整合 ,所以没有配置 , 只能硬编码

创建对象 :

private RestHighLevelClient client;

创建一个索引:

void test{
    HttpHost host = HttpHost.create("http://localhost:9200"); //创建一个请求 
    RestClientBuilder builder = RestClient.builder(host);
    client = new RestHighLevelClient(builder); //获取RestHighLevelClient对象

    //注意这里要使用这个import org.elasticsearch.client.indices.CreateIndexRequest;包不然会报错 , 显
    CreateIndexRequest request = new CreateIndexRequest("books"); //专门用来创建索引用的
    reqeust.source(json格式的数据,XcontentType.JSON) //设置请求中的参数 : 
    client.indices().create(request, RequestOptions.DEFAULT);

    client.close(); //需要关闭
}

设置文档 :

HttpHost host = HttpHost.create("http://localhost:9200"); //创建一个请求 
    RestClientBuilder builder = RestClient.builder(host);
    client = new RestHighLevelClient(builder); //获取RestHighLevelClient对象
    
    IndexRequest reqeust = new IndexRequest("books").id("1");
    String json = "";
    request.source(json , XContentType.JSON);
    client.index(request,RequestOptions.DEFAULT);
    client.close(); //需要关闭
  • 批量设置文档 :
@Test
void test(){
    HttpHost host = HttpHost.create("http://localhost:9200"); //创建一个请求 
    RestClientBuilder builder = RestClient.builder(host);
    client = new RestHighLevelClient(builder); //获取RestHighLevelClient对象
    
    List<Book> bookList = bookDao.selectList(null);
    BulkRequest bule = new BulkRequest();
for(Book book:bookList){
IndexRequest request = new IndexRequest("books").id(book.getId().toString());
    String json = JSON.toJSONString(book);
    request.source(json,XContentType.JSON);
    bulk.add(request);
}
    client.bulk(bulk,RequestOptions.DEFAULT);
    
    client.close(); //需要关闭
}
  • 查询文档 :
  • 按条件查文档: