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;
}
- 模糊查询
模糊查询官方文档主要提供四种方法,相关信息如下:
- prefix 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日