创建索引
CreateIndexRequest index = new CreateIndexRequest("book");
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(index, RequestOptions.DEFAULT);
boolean acknowledged = createIndexResponse.isAcknowledged();
System.out.println(acknowledged);
查询索引
GetIndexRequest request=new GetIndexRequest("user");
GetIndexResponse getIndexResponse = restHighLevelClient.indices().get(request, RequestOptions.DEFAULT);
System.out.println(getIndexResponse.getAliases());
System.out.println(getIndexResponse.getMappings());
System.out.println(getIndexResponse.getSettings());
删除索引
DeleteIndexRequest request=new DeleteIndexRequest("book");
AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
System.out.println(delete.isAcknowledged());
添加文档
IndexRequest request=new IndexRequest();
//不指定id则自动创建id
request.index("book").id("1011");
Book book=new Book();
// book.setId(1);
book.setName("书籍‘");
String s = JSON.toJSONString(book);
request.source(s,XContentType.JSON);
IndexResponse index = restHighLevelClient.index(request, RequestOptions.DEFAULT);
System.out.println(index.getResult());
更新
UpdateRequest request=new UpdateRequest();
request.index("book").id("1011");
request.doc(XContentType.JSON,"name","jj");
UpdateResponse update = restHighLevelClient.update(request, RequestOptions.DEFAULT);
System.out.println(update.getResult());
实用的更新(查询后更新)
UpdateByQueryRequest updateByQueryRequest = new UpdateByQueryRequest("索引名");
updateByQueryRequest.setQuery(new TermQueryBuilder("esopEnterpriseId", information.getTktEnterpriseInformationId()));
Map<String, Object> params = new HashMap<>();
params.put("dataState", information.getDataState());
params.put("dataStateStr",information.getDataStateStr());
script设置的是脚本, Script 构造器(脚本类型, 语言, 命令, 传入参数)
//脚本类型分为: ScriptType.INLINE 和 ScriptType.STORED
//lang语言 painless 是es自带的
Script script = new Script(ScriptType.INLINE, "painless", "ctx._source.dataState=params.dataState;ctx._source.dataStateStr=params.dataStateStr", params);
updateByQueryRequest.setScript(script);
restHighLevelClient.updateByQuery(updateByQueryRequest, RequestOptions.DEFAULT);
查询(精确匹配)
` SearchRequest request=new SearchRequest();
request.indices("book");
request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("name","1")));
request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("id","1")));
SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);`
多条件查询
SearchRequest request1 = new SearchRequest("titems");
//构建搜索条件
SearchSourceBuilder builder = new SearchSourceBuilder();
//按照颜色查询方法,其中keyword表示不分词匹配,把该词当成一个整体
//像这种不分词查询的一般都会再mapping中设置为keyword类型
//QueryBuilders.matchQuery()表示模糊查询,所谓的模糊查询就是分词查询
//QueryBuilders.termQuery()表示精确查询,不会拆分
//上面两个如果字段是keyword类型则都是精确匹配查询
//条件判断,如果传入的属性为空的话则不执行该查询条件
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if(null != req.getItem_brand()){
//must就相当于一个and
boolQueryBuilder.must(QueryBuilders.matchQuery("item_brand.keyword", req.getItem_brand()));
}
if(null != req.getItem_color()){
boolQueryBuilder.must(QueryBuilders.matchQuery("item_color.keyword", req.getItem_color()));
}
//should就相当于or
//QueryBuilders.boolQuery().should(QueryBuilders.matchQuery()).should()
//单条件查询
// MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("item_color.keyword", req.getItem_color());
builder.query(boolQueryBuilder);
查询后排序然后转为对象
//1. 创建Request
SearchRequest request = new SearchRequest(EsopEnterpriseInformationConstant.ES_ESOP_ENTERPRISE_INDEX_NAME);
//2. 指定查询条件
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.query(QueryBuilders.matchAllQuery());
builder.size(10000);
builder.sort("busiRegCityCode", SortOrder.ASC);
builder.sort("busiRegCountyCode",SortOrder.ASC);
builder.sort("busiRegGridCode",SortOrder.ASC);
request.source(builder);
//3. 执行查询
SearchResponse resp = null;
try {
resp = restHighLevelClient.search(request, RequestOptions.DEFAULT);
} catch (IOException e) {
e.printStackTrace();
}
List<ESEnterpriseInformation> list=new ArrayList<>();
for (SearchHit hit : resp.getHits().getHits()) {
String sourceAsString = hit.getSourceAsString();
ESEnterpriseInformation information = JSONObject.parseObject(sourceAsString, ESEnterpriseInformation.class);
list.add(information);
}
查询字段不为null并且不为空的数据
SearchRequest request=new SearchRequest();
request.indices("book");
// 多条件组合查询
SearchSourceBuilder builder=new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//name的值必须null
boolQueryBuilder.must(QueryBuilders.existsQuery("name"));
//name的值必须不null
boolQueryBuilder.must(QueryBuilders.existsQuery("name"));
//name值不为空
//如果字段类型为keyword就不用加.keyword,
//在must内部,termQuery和matchQuery测试出来没什么区别
boolQueryBuilder.mustNot(QueryBuilders.termQuery("name.keyword",""));
builder.query(boolQueryBuilder);
request.source(builder);
SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
总结大概的步骤
首先,Request,然后指定request的索引,然后如果是增删改,就要指定request的source,如果是查询,就指定request的query,这个query中的内容是一个searchQueryBuilder,而searchQueryBuilder内部需要指定查询条件,而这个条件是用QueryBuilders.termQuery或者QueryBuilders.matchQuery()或者QueryBuilders.existQuery()
我只觉得类太多了,很繁琐,以后应该将统一一个顶层接口,索引操作一个接口,文档一个接口,这样更能入门