elasticsearch
ik分词器
两种分词效果
ik_smart 最少切分 你设置的搜索是中国 那么只有输入中国才能搜索到
ik_max_word 最细粒度划分 你设置中国 那么 你输入中、国、中国 都可以受到
手动配置个人的分词器
一般情况下 分词器只会存储词典里的东西 比如 中国 世界等词汇 这些词汇 他们会自动被ik分词器使用 但有时候一些特殊的词字典是不存在的 我们需要手动配置 在配置文件中的IKAnalyzer.cfg定义你自己想用的词汇文件 然后启动es时帮你加载上
Rest风格
一种软件架构的风格 而不是标准 只是提供了一些原则和约束,他主要用于客户端和服务器交互类的软件,基于这个设计可以更简洁,更有层次更易于实现缓存等机制
method | url地址 | 描述信息 |
---|---|---|
PUT | localhost:9200/索引名称/类型名称/文档id | 创建文档(随机id) |
POST | localhost:9200/索引名称/类型名称 | 创建文档(随机id) |
POST | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
DELETE | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
GET | localhost:9200/索引名称/类型名称/文档id | 查询文档,通过id |
POST | localhost:9200/索引名称/类型名称/文档id | 查询所有数据 |
索引的基本操作
创建一个索引
PUT text1
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "long"
},
"birth": {
"type": "date"
}
}
}
}
这一个操作相当于建立一个数据库 并且设置了名字等字段
PUT test/type01/1
{
"name": "张三",
"age": 5
}
创建索引 并且建立一个文档建立一个用户1 添加了字段和值
获取
GET test1
GET test1/user/1/_search?q=name:张三
GET test1/user/1/_search
{
"query": {
"match": {
"name": "张三"
}
}
}
修改
1.PUT test/type01/1
{
"name": "张三1",
"age": 5
}
暴力修改法 把所有的字段重新输入一遍 但注意必须都重写 少一个 他就给你删除
2.POST test/type1/1/_update
{
"name": "李四"
}
删除
DELETE test1
查询常用的命令
query 查询条件
(match 准确查询/bool布尔查询{must 必须符合的条件一个或多个/should 或者 符合一个就行})
sort 排序
form+size 分页查询
filter 过滤条件
range范围
gt gte lt lte 大于 大于等于 小于 小于等于
高亮字段 highlight-》field字段-》name:{}
自定义的高亮条件 pre_tags:前缀 post_tags:后缀 前缀+内容+后缀 完整的高亮
两种类型的区别 text 和 keyword
text类型的数据 会被分词器解析 所有数据可以拆分搜索
keyword会被当成一个整体 无法被分词器拆开 搜索必须要完整的字符串
springboot集成es的基本操作
索引
@Autowired
@Qualifier("restHighLevelClient")
private RestHighLevelClient client;
@Test
void contextLoads() throws IOException {
//创建索引
CreateIndexRequest request = new CreateIndexRequest("zxh_study");
//将创建好的索引发送到客户端 类型是默认类型
CreateIndexResponse indexResponse = client.indices().create(request, RequestOptions.DEFAULT);
System.out.println(
indexResponse
);
}
//判断索引是否存在
@Test
void text1() throws IOException {
//获取索引
GetIndexRequest request = new GetIndexRequest("zxh_study");
//判断客户端是否存在索引
boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
//删除一个索引
@Test
void text2() throws IOException {
DeleteIndexRequest request = new DeleteIndexRequest("zxh_study");
//删除这个索引
AcknowledgedResponse delete = client.indices().delete(request, RequestOptions.DEFAULT);
System.out.println(delete.isAcknowledged());
}
文档的基础操作
//添加数据
@Test
void text3() throws IOException {
User user = new User("你", 5);
//创建请求
IndexRequest request = new IndexRequest("zxh_study");
//写入id
request.id("1");
request.timeout("1s");
//将写好的数据放入请求中 然后转换
request.source(JSON.toJSONString(user), XContentType.JSON);
//往客户端发送请求
IndexResponse index = client.index(request, RequestOptions.DEFAULT);
System.out.println(index.toString());//获取你上传的信息
System.out.println(index.status());//对应的数据状态 你是创建还是修改还是删除
}
//获取文档 判断文档是否存在
@Test
void text4() throws IOException {
GetRequest request = new GetRequest("zxh_study", "1");
//不获取返回值中的_source下的东西 也就是数据
request.fetchSourceContext(new FetchSourceContext(false));
request.storedFields("_none_");
boolean exists = client.exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
//获取文档信息
@Test
void text5() throws IOException {
GetRequest request = new GetRequest("zxh_study", "1");
GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
System.out.println(getResponse.getSourceAsString());
}
//更新数据
@Test
void text6() throws IOException {
UpdateRequest updateRequest = new UpdateRequest("zxh_study", "1");
User user = new User("张三", 6);
updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);
UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(update.status());
}
//精确查询用户
@Test
void test7() throws IOException {
//构建搜索条件
SearchRequest request = new SearchRequest("zxh_study");
//添加你想要的条件 比如精确查询 或者排序 或者分页等等
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "zxh");
sourceBuilder.query(termQueryBuilder);
//将条件写好放入请求中
request.source(sourceBuilder);
//发送请求
SearchResponse searchResponse = client.search(request, RequestOptions.DEFAULT);
//获取响应回来的数据
System.out.println(JSON.toJSONString(searchResponse.getHits()));
for (SearchHit documents:searchResponse.getHits().getHits()
) {
System.out.println(documents.getSourceAsMap());
}
}