ES 7.10.1 用到的一些查询方法
前言
第一次写,记录一下自己用到的场景,不一定对你有帮助,新手的话,可以去看看狂神的视频,个人觉得可以的。有啥建议可以提出来。公司项目中需要用到es,自己经验不足,直接上手了es 的最新版。然后发现项目中springboot版本比较低,之前没有考虑到,然后又小小的学习了一下,新版的es相比较旧版(目前用的包 6.4的clint)的话,有些参数必须要。其中_type 这个参数必须要的,但是我感觉用处也不是很大。欢迎指定,一起学习!
一、索引的操作
直接上手api吧,ElasticSearchCommon 是自己将所有的索引封装出来的,这里是需要一个字符串的!
提前准备的话:导入springboot封装过后的es(也可以不用这样)依赖。然后写一下配置类,配置类我贴出来,再注入一下
配置类
注入client,Qualifier 是配置类bean中的方法名。不咋懂的话去看狂神教学视频
1.新增索引
// 创建索引请求
CreateIndexRequest createIndex = new CreateIndexRequest(ElasticSearchCommon.LG_SESSION);
// 客户端执行请求
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndex, RequestOptions.DEFAULT);
2.删除索引
DeleteIndexRequest deletRequest = new DeleteIndexRequest(ElasticSearchCommon.LG_SESSION);
AcknowledgedResponse delete = restHighLevelClient.indices().delete(deletRequest, RequestOptions.DEFAULT);
3.查询索引
GetIndexRequest getIndexRequest = new GetIndexRequest(ElasticSearchCommon.LG_SESSION);
boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
二、文档操作(重点是查询吧)
2.1新增文档
2.1.1 单独添加
IndexRequest indexRequest = new IndexRequest(ElasticSearchCommon.LG_SESSION);
// 版本低一点的话需要加上type类型
indexRequest.type("自己定义的类型");
SessionEntity sessionEntity = new SessionEntity();
sessionEntity.setId(1);
sessionEntity.setConversationTime(getNowTime());
sessionEntity.setMsgState(1);
sessionEntity.setAddrImages("/addr/images");
sessionEntity.setVipId("VIP545465");
sessionEntity.setCustomerServerName("弟弟1号");
IndexRequest source = indexRequest.source(JSON.toJSONString(sessionEntity), XContentType.JSON);
IndexResponse index = restHighLevelClient.index(source, RequestOptions.DEFAULT);
System.out.println("预留内容添加状态:"+index.status());
2.1.2 批量添加
// 创建请求
BulkRequest bulkRequest = new BulkRequest(ElasticSearchCommon.LG_SESSION);
// 创建批量数据
List<ProblemTypeEntity> list = new ArrayList<ProblemTypeEntity>();
list.add(new ProblemTypeEntity(1,"111"));
list.add(new ProblemTypeEntity(2,"222"));
list.add(new ProblemTypeEntity(3,"333"));
list.add(new ProblemTypeEntity(4,"444"));
list.add(new ProblemTypeEntity(5,"555"));
list.add(new ProblemTypeEntity(6,"666"));
list.add(new ProblemTypeEntity(7,"777"));
list.add(new ProblemTypeEntity(8,"888"));
// 循环添加
for (int i = 0;i<list.size();i++){
bulkRequest.add(
new IndexRequest(ElasticSearchCommon.LG_SESSION)
//.id(""+(i+1)) // 设置es 当中_id,不设置的话是一串字符
.source(JSON.toJSONString(list.get(i)),XContentType.JSON)
);
}
BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println("循环添加的数据状态:"+bulk.status());
2.2删除文档
7.10版可以这样写,根据其他字段条件去查询删除,较新版本的删除这我觉得是最方便的
DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(ElasticSearchCommon.LG_PROBLEM);
DeleteByQueryRequest deleteByQueryRequest1 = deleteByQueryRequest.setQuery(QueryBuilders.termQuery("id", 12));
BulkByScrollResponse bulkByScrollResponse = restHighLevelClient.deleteByQuery(deleteByQueryRequest1, RequestOptions.DEFAULT);
System.out.println("删除了几条:"+bulkByScrollResponse.getStatus().getDeleted());
老一点的版本,就必须带上_type,我所有的都叫_type,目前没感觉到用处,目前探索到,删除只能更具_id 去查询
DeleteRequest deleteRequest = new DeleteRequest(ElasticSearchCommon.LG_PROBLEM,"_doc","_id的值");
DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
2.3更改文档
//第一种写法
// 创建请求
UpdateRequest updateRequest = new UpdateRequest(ElasticSearchCommon.LG_SESSION,"这里就是_id了");
// 创建需要更改的数据
UserEntity userEntity = new UserEntity("更改后的数据",28, CommonUtils.getTimeFormat());
// 修改的数据放入请求中
updateRequest.doc(JSON.toJSONString(userEntity),XContentType.JSON);
// 客户端发送请求
UpdateResponse update = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
// 打印状态
System.out.println("更新状态:"+update.status());
2.4查询文档(重点)
你要去了解QueryBuilders里面的一些方法。
*QueryBuilders.termQuery(“key”, obj) 完全匹配,输入的查询内容是什么,就会按照什么去查询,并不会解析查询内容,对它分词。
*QueryBuilders.termsQuery(“key”, obj1, obj2…) 一次匹配多个值
*QueryBuilders. matchQuery(“key”, Obj) 单个匹配,match查询,会将搜索词分词,再与目标查询字段进行匹配,若分词中的任意一个词与目标字段匹配上,则可查询到。
*QueryBuilders. multiMatchQuery(“text”, “field1”, “field2”…); 匹配多个字段, field有通配符忒行
QueryBuilders. matchAllQuery(); 匹配所有文件
QueryBuilders.matchPhraseQuery(“supplierName”,param);默认使用 match_phrase 时会精确匹配查询的短语,需要全部单词和顺序要完全一样,标点符号除外
QueryBuilders.wildcardQuery(“supplierName”,""+param+"") ;条件wildcard不分词查询,加(相当于sql中的%)表示模糊查询,加keyword表示查不分词数据
2.4.1
builderList 我自己写的操作es库的一个方法;
随机一个方法:
SearchRequest searchRequest = new SearchRequest(ElasticSearchConstant.LG_PROBLEM);
MatchQueryBuilder should = QueryBuilders.matchQuery("content", content).operator(Operator.OR);
List<Map<String, Object>> list = builderList(should, searchRequest,null,0,5);
HashMap<String,Object> hashMap = new HashMap<String, Object>();
// 分词未搜到则 返回热度最高的5个数据
if (list.size() <= 0){
List<Map<String, Object>> heatList = MostHeat();
hashMap.put("heat","未查询到关键词,返回热度最高的五个问题!");
heatList.add(0,hashMap);
return heatList;
}
builderList方法:(restHighLevelClient 这个有update、delete、search、index等,具体的话去了解了解)
//构建构造者
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.timeout(TimeValue.timeValueMillis(1));
// 分页条件
if (!"".equals(page) && null != page){
if (page < 0 ){
page = 0;
}
searchSourceBuilder.from(page);
}
// 分页条件
if (!"".equals(pageSize) && null != pageSize){
if (pageSize <= 0 ){
pageSize = 1;
}
searchSourceBuilder.size(pageSize);
}
// 排序条件
if (!"".equals(sortName) && null != sortName){
searchSourceBuilder.sort(sortName, SortOrder.DESC);
}
// 查询条件
if (null != queryBuilder ){
searchSourceBuilder.query(queryBuilder);
}
//searchSourceBuilder.highlighter().preTags("<p class='one' style='color:red'>").postTags("</p>").field("content");
SearchRequest source = searchRequest.source(searchSourceBuilder);
SearchResponse search = restHighLevelClient.search(source, RequestOptions.DEFAULT);
List<Map<String,Object>> list = new ArrayList<>();
for (SearchHit hit : search.getHits().getHits()) {
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
sourceAsMap.put("_id",hit.getId());
//sourceAsMap.remove("addrImages");
list.add(sourceAsMap);
}
三、附带上kibana 中间的一些语法,可以根据这个去尝试一下其他Java查询方法
3.1多条件查询
customerName.keyword 代表不分词搜索,整体搜索,完全匹配
query.term,之前网上也是说不分词搜索,欢迎大佬指定
3.2must(必须),must_not(不必须),shuold(相当于or)
3.3过滤条件(gte,gt,lte,lt相信你们都知道)
3.4限制搜索条件(这里表示从第0条开始查询5条)、sort(numbers是字段,order不要变,desc降序,asc升序)排序
3.5高亮显示(其实就是放了前端代码过来)注意一下hightlight的用法,目前项目中还没用到,你们可以去探索
三、总结
还是得自己去摸索着玩吧,这样踩几个坑就知道了,后续会更新其他的。写博客主要就是怕自己后面忘了。。。。