目录
- 十、Java操作ElasticSearch
-
- 1、引入maven依赖
- 2、添加实体类
- 3、创建索引
- 4、索引一条数据
- 5、删除一条索引
- 6、更新文档
- 7、批量索引
- 8、普通查询一条文档
- 9、高级检索
-
- 查询所有并排序、分页
- 查询返回字段
- 检索查询
- 高亮查询
- 过滤查询
十、Java操作ElasticSearch
本章基于ElasticSearch6.2.4版本
1、引入maven依赖
<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>6.2.4</version>
</dependency>
<dependency><groupId>org.elasticsearch</groupId><artifactId>transport</artifactId><version>6.2.4</version>
</dependency>
2、添加实体类
@Data
@Accessors(chain=true) //链式编程 set方法返回当前对象
public class Book{
private String id;private String name;private String sex;private Integer age;private String content;
}
3、创建索引
//创建索引、类型、字段映射
@Test
public void testCreateIndexAndTypeAndMapping() throws Exception {
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.0.1"), 9300));System.out.println("=========创建索引=========");CreateIndexResponse indexResponse = transportClient.admin().indices().prepareCreate("dangdang").execute().get();System.out.println(indexResponse.index());System.out.println("========创建类型指定映射=======");XContentBuilder mappingBuilder = XContentFactory.jsonBuilder();appingBuilder.startObject().startObject("properties").startObject("name").field("type", "text") .field("analyzer","ik_max_word").endObject().startObject("age").field("type", "integer").endObject().startObject("sex").field("type", "keyword").endObject().startObject("content").field("type", "text").field("analyzer", "ik_max_word").endObject().endObject().endObject();PutMappingRequest putMappingRequest = new PutMappingRequest("dangdang").type("book").source(mappingBuilder);transportClient.admin().indices().putMapping(putMappingRequest).get();}
NOTE:下面省略创建TransportClient的过程
4、索引一条数据
//索引一条记录到ES 如果指定id 使用指定id作为文档_id,如果不指定id为自动生成
@Test
public void testAddDocument() throw Exception{
Map<String, Object> result=new HashMap<>();result.put("name", "小黑的故事");result.put("sex", "男");result.put("age","23");result.put("content", "小黑的故事,小黑今天特别开心");IndexResponse indexReponse=transportClient.prepareIndex("dangdang","book",1).setSource(result) //设置数据.get(); //发送请求到ES//也可以传入JSON格式数据// .setSource(json,XContentType.JSON) //设置数据,请求类型为json格式System.out.println(indexReponse.status());
5、删除一条索引
//删除一条索引记录
@Test
public void testDelete() throws Exception {
DeleteResponse deleteResponse = transportClient.prepareDelete("dangdang", "book", "1").get();System.out.println(deleteResponse.status());
}
6、更新文档
//更新文档
@Test
public void testUpdate() throws Exception{
Map<String,Object> result=new HashMap<>();result.put("name", "小黑的故事-1");UpdateResponse updateResponse = transportClient.prepareUpdate("dangdang", "book", "1").setDoc(result).get();//也可以转成JSON格式传输// .setDoc(json,XContentType.JSON)System.out.println(updateResponse.status());
}
7、批量索引
//批量操作,添加、更新、删除
@Test
public void testBulk() throws Exception{
//索引一条记录Book book=new Book();book.setId("3");book.setSex("女");book.setName("下载问题-3");book.setContent("今天下载好慢");IndexRequest indexRequest=new IndexRequest("dangdang", "book", book.getId());indexRequest.source(JSONObject.toJSONString(book),XContentType.JSON);//删除一条记录DeleteRequest deleteRequest = new DeleteRequest("dangdang","book","1");//更新记录Book updateBook=new Book();updateBook.setId("4cdbc040-657a-4847-b266-7e31d9e2c3d9");updateBook.setName("下载依赖问题-update");UpdateRequest updateRequest = new UpdateRequest("dangdang", "book", updateBook.getId());BulkResponse bulkResponse = transportClient.prepareBulk().add(indexRequest).add(deleteRequest).add(updateRequest).get();BulkItemResponse[] items = bulkResponse.getItems();for (BulkItemResponse bulkItemResponse : items) {
System.out.println(bulkItemResponse.status());}
}
8、普通查询一条文档
//查询一个
@Test
public void testFindOne(){
GetResponse getResponse = transportClient.prepareGet("dangdang","book","1").get();String sourceAsString = getResponse.getSourceAsString();System.out.println(sourceAsString);
}
9、高级检索
查询所有并排序、分页
/*** 查询所有并排序* ASC 升序 DESC 降序* addSort("age",SortOrder.ASC) 指定排序字段以及使用哪种方式排序 * addSort("age",SortOrder.DESC) 指定排序字段以及使用哪种方式排序* setFrom(0) 从第几页开始* setSize(2) 返回几条数据*/
@Test
public void testMatchAllQuery() throws Exception {
SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(QueryBuilders.matchAllQuery()).addSort("age", SortOrder.DESC) //排序.setFrom(0) //从第0页开始.setSize(2) //返回2条数据.get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数:"+hits.totalHits);for (SearchHit hit : hits) {
System.out.println("当前索引的分数:"+hit.getScore());System.out.println("对应结果:====="+hit.getSourceAsString());System.out.println("指定字段结果:"+hit.getSourceAsMap().get("name"));System.out.println("======================");}
}
查询返回字段
/*** 查询返回指定字段(source)默认返回所有* setFetchSource 参数1:包含哪些字段 参数2:排除哪些字段* setFetchSource("*","age") 返回所有字段中排除age字段* setFetchSource("name","") 只返回name字段* setFetchSource(new String[]{},new String[]{}) 默认返回所有*/
@Test
public void testMatchAllQuery() throws Exception {
SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").setQuery(QueryBuilders.matchAllQuery()).setFetchSource("*","age").get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数:"+hits.totalHits);for (SearchHit hit : hits) {
System.out.println("当前索引的分数:"+hit.getScore());System.out.println("对应结果:====="+hit.getSourceAsString());System.out.println("指定字段结果:"+hit.getSourceAsMap().get("age"));System.out.println("======================");}
}
检索查询
/** 1、Term查询* 2、range查询* 3、prefix查询* 4、wildcard通配符查询* 5、ids查询* 6、fuzzy模糊查询* 7、bool查询* 8、多字段查询* 9、多字段分词查询(与8不同的十可以设置分词器) @Test public void testTerm() throws Exception{// 1、Term查询TermQueryBuilder termQuery = QueryBuilders.termQuery("name", "小黑");// 2、range查询RangeQueryBuilder rangQuery = QueryBuilders.rangeQuery("age").lt(45).gte(40);// 3、prefix查询PrefixQueryBuilder prefixQuery = QueryBuilders.prefixQuery("name", "小");// 4、wildcard通配符查询WildcardQueryBuilder wildcardQuery = QueryBuilders.wildcardQuery("name", "小*");// 5、ids查询IdsQueryBuilder idsQuery = QueryBuilders.idsQuery().addIds("1","2");// 6、fuzzy模糊查询FuzzyQueryBuilder fuzzyQuery = QueryBuilders.fuzzyQuery("content", "小白");// 7、bool查询BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();boolQuery.should(QueryBuilders.matchAllQuery());boolQuery.mustNot(QueryBuilders.rangeQuery("age").lte(8));boolQuery.must(QueryBuilders.termQuery("name", "小黑"));//8、多字段查询MultiMatchQueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery("框架", "content","name");//9、多字段分词查询QueryStringQueryBuilder field = QueryBuilders.queryStringQuery("框架张无忌").analyzer("ik_max_word") //定义分词器.field("name").field("content"); //字段transportClient.prepareSearch("dangdang").setTypes("book").setQuery(termQuery).get(); }
高亮查询
/*** 高亮查询* highlighter(highlightBuilder)用来指定高亮设置* requireFiledMatch(false)开启多个字段高亮* field 用来定义哪些字段高亮 *表示高亮所有字段* preTags("<span style='color:red'>") 用来指定高亮的前缀* postTags("</span>") 用来指定高亮后缀*/
@Test
public void testHighLight() throws Exception {
TermQueryBuilder termQuery = QueryBuilders.termQuery("name", "小黑");HighlightBuilder highlightBuilder = new HighlightBuilder();highlightBuilder.requireFieldMatch(false).field("name").field("content").preTags("<span style='color:red'>").postTags("</span>");SearchResponse searchResponse = transportClient.prepareSearch("dangdang").setTypes("book").highlighter(highlightBuilder).setQuery(termQuery).get();SearchHits hits = searchResponse.getHits();System.out.println("符合条件的记录数:"+hits.totalHits);for (SearchHit hit : hits) {
Map<String, Object> sourceAsMap = hit.getSourceAsMap();Map<String, HighlightField> highlightFields = hit.getHighlightFields();System.out.println("=========高亮之前=========");sourceAsMap.forEach(((k,v)->{
System.out.println("key:"+k+" value:"+v);});System.out.println("==========高亮之后========");for(Map.Entry<String, Object> entry:sourceAsMap.entrySet()){
HighlightField highlightField = highlightFields.get(entry.getKey());if(highlightField!=null){
System.out.println("key:"+entry.getKey()+" value:"+highlightField.getFragments()[0]);}else{
System.out.println("key:"+entry.getKey()+" value:"+entry.getValue());}}}
}
过滤查询
/*** 会先进行filter过滤然后在执行query查询*/
@Test
public void queryFilter() throws Exception {
transportClient.prepareSearch("dangdang").setTypes("book").setQuery(QueryBuilders.termQuery("content", "spring")).setPostFilter(QueryBuilders.rangeQuery("age").gt(23)).get();
}