1. 编写目的

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

2. 具体内容

  1. 依赖包引入。
<!-- 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>
  1. 基本过程介绍。
  1. 建立es连接,获得RestHighLevelClient类的对象。
  2. 调用client的方法,进行根据单个键值对查询,并在try-catch-finally的finally中调用client.close();
  1. 创建与删除索引(可理解为数据库)
@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();
}
  1. 几个详细例子。
  1. 根据多个键值对进行查询。
    具体代码如下:
/**
 * 多条件查询
 * @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;
}
  1. 根据单个键值对进行查询。
/**
 * 根据单个属性查询
 * @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);
}
  1. 根据时间查询。
/**
 * 根据时间段去查询
 * @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);
}
  1. 删除索引。
    也可以说是整个文档(数据库)。
/**
 * 删除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;
}
  1. 模糊查询
    模糊查询官方文档主要提供四种方法,相关信息如下:
  • 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日