基础概念
elasticsearch 是面向 文档存储 的,可以是数据库中的一条商品数据,一个订单信息。
文档数据会被序列化为 json 格式后存储在 elasticsearch 中。
索引
类似Mysql中的表
同类型文档的集合
文档
类似于Mysql中的行数据
一条数据就是一个文档,es中是Json格式
字段
类似于数据库中的列数据
Json文档中的字段
映射
类似于Mysql中的Schema,表结构
索引中文档的约束,比如字段名称,类型
正向索引
Mysql 采用正向索引:基于文档 id 创建索引。查询词条时必须先找到文档,而后判断是否包含搜索的内容
倒排索引
elasticsearch 采用倒排索引:
文档(document):每条数据就是一个文档
词条(term):文档按照语义分成的词语
ES索引库基本操作
创建索引库
mapping 属性
mapping 是对索引库中文档的约束,常见的 mapping 属性包括:
type:字段数据类型,常见的简单类型有:
字符串:text(可分词的文本),keyword(精确值,例如:品牌,国家,邮箱)
数值:long、integer、short、byte、double、float、
布尔:boolean
日期:date
对象:object index:是否创建索引参与搜索,默认为 true,如果不需要参与搜索设置为 false
analyzer:使用哪种分词器
创建索引库和 mapping 的语法如下:
PUT /news
{
"mappings": {
"properties": {
"id":{
"type": "keyword",
"index": false
},
"title":{
"type": "text",
"analyzer": "ik_max_word"
},
"img":{
"type": "keyword",
"index": false
},
"operTime":{
"type": "date",
"index": false
}
}
}
}
查询索引库
语法: GET /索引库名
实例: GET /news
删除索引库
语法: DELETE /索引库名
实例: DELETE /news
修改索引库
索引库和mapping一旦创建无法修改,但是可以添加新的字段
PUT /news/_mapping
{
"properties":{
"count":{
"type":"long"
}
}
}
ES文档操作
新增文档
POST /索引库名/_doc/文档 id
{ "字段名 1":"值 1"
"字段名 2":"值 2"
..... }
例如:
POST /news/_doc/1
{
"id":1,
"title":"三体人向地球开战",
"img":"11111111111111111111.jpg",
"dzcount":8888888
}
POST /news/_doc/2
{
"id":2,
"title":"智子被地球人捕获,用来犁地",
"img":"11111111111111111111.jpg",
"dzcount":88888889
}
POST /news/_doc/3
{
"id":3,
"title":"歌者文明向三体星系投放二向箔",
"img":"11111111111111111111.jpg",
"dzcount":66666666666
}
POST /news/_doc/4
{
"id":4,
"title":"地球通过宇宙广播毁灭了三体星系",
"img":"11111111111111111111.jpg",
"dzcount":66666666666
}
POST /news/_doc/5
{
"id":5,
"title":"歌者文明投放的二向箔导致地球毁灭",
"img":"11111111111111111111.jpg",
"dzcount":66666666666
}
向news中添加5条如上的文档
此时可以在ES head项目中查看添加好的数据
查询文档
语法:
GET /索引库名/_doc/文档 id
删除文档
语法:
DELETE /索引库名/_doc/文档 id
修改文档
POST /索引库名/_update/文档 id
{
"doc":{
"要修改的字段":"新值"
}
}
例如:
POST /news/_update/1
{
"doc":{
"title":"三体人向地球开战,向地球投放智子"
}
}
搜索文档
GET /news/_search
{
"query":{
"match":{
"title":" 美国 "
}
}
}
例如:
GET /news/_search
{
"query": {
"match": {
"title": "地球毁灭"
}
}
}
通过分词器我们可以查询到搜索内容分词后的全部搜索内容
将地球毁灭分词为地球和毁灭,分别搜索到了3条和分词相关的内容
SpringBoot集成ES
官网地址: https://www.elastic.co/guide/en/elasticsearch/client/index.html
指定版本,版本必须与安装的 ES 版本一致
< properties >
< java.version >1.8</ java.version >
< elasticsearch.version >7.6.1</ elasticsearch.version >
</ properties >
添加依赖
< dependency >
< groupId >org.elasticsearch.client</ groupId >
< artifactId >elasticsearch-rest-high-level-client</ artifactId >
</ dependency >
添加初始化 RestHighLevelClient 的配置类
java
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticSearchConfig {
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http")));
return client;
}
}
索引库操作
创建索引库
java
CreateIndexRequest request = new CreateIndexRequest("users");
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request,
RequestOptions.DEFAULT);
判断索引库是否存在
java
GetIndexRequest request = new GetIndexRequest("users");
boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
删除索引库
java
DeleteIndexRequest indexRequest = new DeleteIndexRequest("users");
AcknowledgedResponse delete = restHighLevelClient.indices().delete(indexRequest,
RequestOptions.DEFAULT);
delete.isAcknowledged();//返回 true 删除成功,返回 false 删除失败
文档操作
添加文档
java
//将新闻添加到 mysql 的同时,将数据同步更新到 ES,为搜索提供数据
News news = new News();
news.setId(3);
news.setTitle("美国今年要总统选择,拜登着急了");
news.setImg("aaaaasssss.jpg");
IndexRequest indexRequest = new IndexRequest("news").id(news.getId().toString());
//将对象转为 json 存进 ES
indexRequest.source(new ObjectMapper().writeValueAsString(news),XContentType.JSON);
restHighLevelClient.index(indexRequest,RequestOptions.DEFAULT);修改文档
News news = new News();
news.setId(3);
news.setTitle("中国航母开往美国,准备开战,拜登着急了");
news.setImg("dddddddddddd.jpg");
UpdateRequest updateRequest = new UpdateRequest("news",news.getId().toString());
updateRequest.doc(new ObjectMapper().writeValueAsString(news), XContentType.JSON);
restHighLevelClient.update(updateRequest,RequestOptions.DEFAULT);
查询文档
java
GetRequest getRequest = new GetRequest("news","1");
GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
//获取查询的内容,返回 json 格式
String json = getResponse.getSourceAsString();
//使用 jackson 组件将 json 字符串解析为对象
News news = new ObjectMapper().readValue(json, News.class);
删除文档
java
DeleteRequest deleteRequest = new DeleteRequest("news","1");
DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
搜索文档
java
SearchRequest searchRequest = new SearchRequest("news");
SearchRequest searchRequest = new SearchRequest("news");
//精确条件查询
searchRequest.source().query(QueryBuilders.termQuery("title","美国"));
//发送查询请求
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//接收查询结果
SearchHits hits = search.getHits();
//组装查询结果
ArrayList<News> list = new ArrayList<>();
//取出结果集
for (SearchHit searchHit : hits.getHits()){
String json = searchHit.getSourceAsString();
News news = new ObjectMapper().readValue(json,News.class);
list.add(news);
}