ES:分布式全文搜索引擎
Elasticsearch:是一个分布式全文搜索引擎
工作流程 :
- ES通过分词器 , 分出对应的关键字 ,
- 用户输入对应的关键字
- 通过关键字 , 查找对应的所有带有关键字的数据的id值 ,
- 然后通过这些id值获取到对应的详细数据
概念 | 描述 |
索引 | 是sql中为了加速查询设置的主键 , 根据主键查数据 |
倒排索引 | 整个工作就是依靠倒排索引实现的 , 倒排索引是通过一个个的文档先建立倒排索引的库 , 是根据关键字查索引 |
创建文档 | |
使用文档 |
下载安装运行ES:
- 下载
- https://www.elastic.co/cn/downloads/elasticsearch
- ES的包中内置了一个jdk , 和大量的jar , ES的运行就是要依靠这些
- 启动:
- 在bin目录, 双击elasticsearch.bat ,启动即可 , 默认端口号是9200
ES的基本操作:
要想操作ES , 我们发送web请求即可
ES全面支持RESTful这种风格的操作
就是创建一个索引为books的 , 这个索引就相当于数据库中的库一样
索引操作 | uri | 请求 | 注意事项 |
创建索引 | put请求 | 携带请求体 , json格式的 , 用来设置分词器 , 使用put是为了它的幂等性 | |
查看索引 | get请求 | 不能携带请求体 | |
操作索引 | post请求 | 不能携带请求体 , 后边的id就是指定的文档 | |
删除索引 | 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文档操作 :
添加文档 :
文档操作 | 格式 | 请求 | 注意事项 |
添加文档 | post请求 | 记得指定id,不然会使用默认的id,是一个长字符串,同时记得在请求体中添加json格式的文档数据 | |
添加文档 | post请求 | 同上 | |
查看文档数据 | get请求 | 注意 , 这里不能使用_create , 只能使用_doc | |
查看所有文档数据 | http://localhost:9200/books/_search | get请求 | 这里使用的不是_doc , 而是_search |
按照分词进行查询 | http://localhost:9200/books/_search?q=name:思尘 | get请求 | 这里使用的不是_doc , 而是_search |
按照id删除文档 | delete请求 | 这里使用的也是_doc | |
按照id修改文档(全量修改) | put请求 | 这里使用的也是_doc , 要携带json类型的值 , 可以只携带一条数据 , 其他没有设置值的属性就会被抹掉 , 并且每修改一次 , 它的版本号会加一 | |
按照id修改文档(修改单个属性,不进行覆盖) | 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(); //需要关闭
}
- 查询文档 :
- 按条件查文档: