irpas技术客

elastic search7 java开发简单教程_m0_67390969_elasticsearch java开发

irpas 1617

1. 编写目的

简要介绍elastic search 7 的java开发过程。

2. 具体内容

依赖包引入。

<!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch --> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>7.2.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/elasticsearch-rest-high-level-client --> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.2.0</version> </dependency>

基本过程介绍。

建立es连接,获得RestHighLevelClient类的对象。调用client的方法,进行根据单个键值对查询,并在try-catch-finally的finally中调用client.close();

创建与删除索引(可理解为数据库)

@Test public void testCreate() throws IOException { RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("服务器地址", 9200, "http"))); CreateIndexRequest request = new CreateIndexRequest("myindex2"); CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT); assert createIndexResponse.isAcknowledged(); client.close(); } @Test public void testDelete() throws IOException { RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("es.smileyan.cn", 9200, "http"))); DeleteIndexRequest request = new DeleteIndexRequest("myindex2"); client.indices().delete(request, RequestOptions.DEFAULT); client.close(); }

几个详细例子。

根据多个键值对进行查询。 具体代码如下:

/** * 多条件查询 * @param mustMap * @param length * @return */ public static List<String> multiSearch(Map<String,Object> mustMap,int length) { // 根据多个条件 生成 boolQueryBuilder BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); // 循环添加多个条件 for (Map.Entry<String, Object> entry : mustMap.entrySet()) { boolQueryBuilder.must(QueryBuilders .matchQuery(entry.getKey(), entry.getValue())); } // boolQueryBuilder生效 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(boolQueryBuilder); searchSourceBuilder.size(length); // 其中listSearchResult是自己编写的方法,以供多中查询方式使用。 return listSearchResult(searchSourceBuilder); }

getRestHighLevelClient方法是获得client的方法,并且里面需要制定ES_URL与ES_PORT,即Elastic Search的服务地址以及服务端口。

listSearchResult方法是根据searchSourceBuilder来提交查询请求,并且获得查询结果,以List 的格式返回。

/** * getRestHighLevelClient * @return */ public static RestHighLevelClient getRestHighLevelClient() { RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost(ES_URL, ES_PORT, "http"))); return client; } /** * 用来处理搜索结果,转换成链表 * @param builder * @return */ public static List<String> listSearchResult(SearchSourceBuilder builder) { // 提交查询 SearchRequest searchRequest = new SearchRequest(ES_NAME); searchRequest.source(builder); RestHighLevelClient client = getRestHighLevelClient(); // 获得response SearchResponse searchResponse = null; try { searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); } finally { if(client != null) { try { client.close(); } catch (IOException e) { e.printStackTrace(); } } } // 从response中获得结果 List<String> list = new LinkedList<>(); SearchHits hits = searchResponse.getHits(); Iterator<SearchHit> iterator = hits.iterator(); while(iterator.hasNext()) { SearchHit next = iterator.next(); list.add(next.getSourceAsString()); } return list; }

根据单个键值对进行查询。

/** * 根据单个属性查询 * @param key * @param value * @param length * @return */ public static List<String> simpleSearch(String key,Object value,int length) { // 使用上面已经编写好的方法 Map<String,Object> map = new HashMap<>(); map.put(key,value); return multiSearch(map,length); }

根据时间查询。

/** * 根据时间段去查询 * @param length * @return */ public static List<String> searchByDate(Date from,Date to,int length) { // 生成builder RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("date").from(from).to(to); /// boolQueryBuilder生效 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.query(rangeQueryBuilder); searchSourceBuilder.size(length); return listSearchResult(searchSourceBuilder); }

删除索引。

也可以说是整个文档(数据库)。

/** * 删除es的整个数据库 * @param id * @return * @throws IOException */ public static boolean delete() throws IOException { RestHighLevelClient client = getRestHighLevelClient(); DeleteIndexRequest request = new DeleteIndexRequest(ElasticSearchUtil.ES_NAME); client.indices().delete(request, RequestOptions.DEFAULT); return true; }

模糊查询

模糊查询官方文档主要提供四种方法,相关信息如下:

文档地址: https://www.elastic.co/guide/en/elasticsearch/client/java-api/7.2/java-term-level-queries.htmlprefix query:找到以指定的具体的字符串开头的文档。wildcard query: 查找指定字段包含与指定模式匹配的术语的文档,其中模式支持单字符通配符(?)和多字符通配符(*)regexp query: 查找指定字段包含与指定正则表达式匹配的术语的文档。fuzzy query: 查找指定字段包含与指定术语模糊相似的术语的文档。模糊度是以水平编辑距离1或2来衡量的。

与上面查找方法类似,代码如下:

/** * 后文段模糊查找方法,可以理解为 like value? * @param key * @param prefix * @param size * @return */ public static List<String> fuzzy(String key, String prefix,int size) { PrefixQueryBuilder builder = QueryBuilders.prefixQuery(key, prefix); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); searchSourceBuilder.size(size); searchSourceBuilder.query(builder); return listSearchResult(searchSourceBuilder); } 3. 总结

因为RestHighLevelClient类是对es常用操作的封装,所以使用这个类的对象来完成操作es是比较简单的,不需要编写query语句。

Smileyan

2019年7月6日


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #ElasticSearch #Java开发 #1 #编写目的简要介绍elastic #search #7 #的java开发过程 #2