java操作ELasticSearch
基于springboot:
user:
@Data //getset
@AllArgsConstructor //有参构造函数
@NoArgsConstructor //无参构造函数
@Component //声明它是spring的一个组件
public class User {
private String name;
private int age;
}
测试添加文档:
@Test
void testAddDocument() throws IOException {
//创建对象
User user = new User("ElasticSearch", 3);
//创建请求
IndexRequest request = new IndexRequest("index1");
//规则
request.id("1");
request.timeout(TimeValue.timeValueSeconds(1));
//将数据放入请求
request.source(JSON.toJSONString(user), XContentType.JSON);
//客户端发送请求
IndexResponse index = client.index(request, RequestOptions.DEFAULT);
System.out.println(index.toString());
}
结果:

测试文档是否存在
@Test
void testIsExists() throws IOException {
GetRequest request = new GetRequest("index1", "1");
//不获取 _source 上下文
request.fetchSourceContext(new FetchSourceContext(false));
boolean exists = client.exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
结果:

获取文档内容
/*获取文档内容*/
@Test
void testGetDocument() throws IOException {
GetRequest request = new GetRequest("index1", "1");
GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
System.out.println(getResponse.getSourceAsString());//打印文档内容
System.out.println(getResponse);
}
结果 :

更新文档内容:
@Test
void testUpdateRequest() throws IOException {
UpdateRequest request = new UpdateRequest("index1", "1");
request.timeout("1s");
User user = new User("ElasticSearch学习", 18);
request.doc(JSON.toJSONString(user),XContentType.JSON);
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println(response.status());
}
结果:

删除文档内容
/*删除文档内容*/
@Test
void testDeleteRequest() throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("index1", "1");
deleteRequest.timeout("1s");
DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println(deleteResponse.status());
}
结果:

批量插入:
/*批量插入*/
@Test
void testBulkRequest() throws IOException {
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
ArrayList<Object> arrayList = new ArrayList<>();
arrayList.add(new User("张三",12));
arrayList.add(new User("李四",15));
arrayList.add(new User("王五",22));
arrayList.add(new User("赵七",26));
arrayList.add(new User("王八",31));
arrayList.add(new User("擎九",20));
for (int i = 0; i <arrayList.size() ; i++) {
bulkRequest.add(
new IndexRequest("index1")
.id(""+(i+1)) //id可要可不要
//转json数据
.source(JSON.toJSONString(arrayList.get(i)),XContentType.JSON));
}
BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulk.hasFailures());//是否失败
}
结果:

精确条件查询
//精确条件查询
@Test
void testSearch() throws IOException {
SearchRequest searchRequest = new SearchRequest("index1");
//构建搜索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//条件查询 如果查询条件为中文 需要在属性添加 .keyword 例如: QueryBuilders.termQuery("name.keyword","张三");
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name.keyword","张三");
//查询所有
MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
// 分页
/*一页多少条*/
sourceBuilder.size(20);
/*从第几个开始*/
sourceBuilder.from(0);
sourceBuilder.query(termQueryBuilder);
// sourceBuilder.query();查询所有
//设置查询时间 如果过了60s将不再查询
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(JSON.toJSONString(searchResponse.getHits()));
System.out.println("+++++++++++++");
for (SearchHit documentFields : searchResponse.getHits().getHits()) {
System.out.println(documentFields.getSourceAsMap());
}
}
结果:

模糊查询
//模糊查询
@Test
void testFuzzyQuery() throws IOException{
SearchRequest searchRequest = new SearchRequest("index1");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("name","张"));
searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchRequest.source(searchSourceBuilder);
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(response.getHits());
for (SearchHit searchHit : response.getHits().getHits()) {
System.out.println(searchHit.getSourceAsMap());
}
}
结果:

高亮搜索:
//高亮搜索
@Test
void testHighlightSearch() throws IOException {
//搜索条件
SearchRequest searchRequest = new SearchRequest("index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder .query(QueryBuilders.matchQuery("name.keyword","张三")) //精确匹配
.timeout(new TimeValue(60, TimeUnit.SECONDS))
.highlighter(new HighlightBuilder()
.field("name.keyword") //搜索字段
.requireFieldMatch(false) // 只需一个高亮
.preTags("<span style='coler:red'>")
.postTags("</span>"));
//执行搜索
searchRequest.source(searchSourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
//解析结果
List<Object> queryList = new LinkedList<>();
for (SearchHit documentFields : search.getHits().getHits()) {
Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();//原来的结果
HighlightField field = documentFields.getHighlightFields().get("name.keyword");
//解析高亮的字段,将原来的字段替换成高亮字段
Text[] texts = field.fragments();
String n_text ="";
for (Text text : texts) {
n_text+= text;
}
sourceAsMap.put("name",n_text);//高亮字段替换原来的内容
queryList.add(sourceAsMap);
}
queryList.forEach((a)-> System.out.println(a));
}
结果:


浙公网安备 33010602011771号