ELK之elasticsearch +logstash+ kibana (二)编写Java客户端代码

根据 前面 我们已经搭建部署并测试好了elasticsearch 搜索引擎无误后,

归根到底 我们是要写Java代码来调用查询服务等来满足我们的业务要求。

编写elasticsearch客户端Java代码 比较简单,在写代码之前,最好把elasticsearch6 文档看下

了解 query must should  match 等基础的命令元素. 

(elasticsearch5以下的老版本的命令与新版本6有些不一样,而之前我们安装的都是最新版本6.6.1,所以我们要看尽可能的新版本的文档)

 

方式三种:

 一. 通过 java REST client  来开发 

      本质组装 类似命令 curl -XGET "http://172.16.28.248:9200/tsuser/doc/_search" -H 'Content-Type: application/json' -d' { .......}

      上一篇所建好的 服务IP:172.16.28.248  索引:tsuser  文档: doc 

二. 基于 elasticsearch 快速开发框架 Elasticsearch BBoss    ---- 类似mybatis 在配置文件直接写 dsl检索

   https://esdoc.bbossgroups.com/#/?id=%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E%E7%9A%84-orm-%E5%BA%93-elasticsearch-bboss

   

三.  官方包org.elasticsearch.client  API 开发

        网上例子也比较都, 下面通过一个简单的例子来测试下。下面代码没有过多的整理,仅仅为 了测试结果     

        以 spring boot 工程为例

        1. pom.xml 导入包  

       <dependency>           ---- 该包最好要导入,因为spring boot 默认会引入一个可能低版本的包,导致某些API缺失
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.6.1</version>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
             <artifactId>transport</artifactId>
             <version>6.6.1</version>
        </dependency>

          2. 创建 TransportClient

@Bean
public TransportClient client() throws UnknownHostException {

     String hostName = "172.16.28.248";
     TransportAddress transportAddress = new TransportAddress(InetAddress.getByName(hostName), 9300);

     String clusterName = "cluster.name";
     String nodeName = "elastic_test";
     Settings settings = Settings.builder().put(clusterName, nodeName).build();
     TransportClient client = new PreBuiltTransportClient(settings);
     client.addTransportAddress(transportAddress);
     return client;
}

          3. 查询接口 UserService 

package bds.portal.web.demo;

import bds.base.model.UserVO;

//test
public interface UserService {
          UserVO search (UserVO vo);
}

 

         4. UserVO 实体 (这里就截图了,属性太多)

         5. 创建 UserServiceImpl 

package bds.portal.web.demo;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
import org.springframework.stereotype.Service;

import bds.base.model.UserVO;


//test
@Service
public class UserServiceImpl implements UserService {

@Resource
private TransportClient client;

@Override
public UserVO search (UserVO vo){

     BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

     // matchQuery 单字段搜索
     if (vo.getUserName() != null) {
        boolQueryBuilder.must(QueryBuilders.matchQuery("username", vo.getUserName()));
      }

      // wildcardQuery :通配符匹配:类似于SQL里面的 LIKE
     if (vo.getHomePhone() != null) {
        boolQueryBuilder.must(QueryBuilders.wildcardQuery("homePhone", 
        "*" + vo.getHomePhone() + "*"));
      }

     // multiMatchQuery :多字段搜索,输入关键字,可以从多个字段匹配,这里 就临时用 username 作为关键字字段
     if (vo.getUserName() != null) {
         boolQueryBuilder.must(QueryBuilders.multiMatchQuery(vo.getUserName(), 
         "username", "homePhone", "userType"));
     }

     //索引: tsuser
      SearchRequestBuilder searchRequestBuilder = client.prepareSearch("tsuser") 
      .setSearchType(SearchType.DFS_QUERY_THEN_FETCH).setQuery(boolQueryBuilder);

      SearchHits hits = searchRequestBuilder.get().getHits();
      List<Map<String, Object>> data = new ArrayList<>();
      hits.forEach(hit -> {
           Map<String, Object> sourceAsMap = hit.getSourceAsMap();
           sourceAsMap.put("_id", hit.getId());
           data.add(sourceAsMap);
      });

     return new UserVO(data,hits.getTotalHits());
   }
}

 

         6. 创建controller

package bds.portal.web.demo;
import javax.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import bds.base.model.UserVO;


/**
* elasticsearch 客户端测试
* @author cheng
*
*/
@RestController
@RequestMapping("es")
public class DemoController {

     @Resource
     private UserService userService;

     @GetMapping("search")
     public Object search(UserVO vo) {
          return userService.search(vo);
     }

}

 

         7 .打断点测试      http://localhost:8080/es/search?userName=xing

 

以上是一个简单的查询测试,仅仅用到了BoolQueryBuilder 查询,还有其他的重要查询:MatchQueryBuilder    MultiMatchQueryBuilder  MatchPhraseQueryBuilder  BoostingQueryBuilder 等等。。。

 

你也可以通过 kibana 的 dev_tools  根据elastic 的规则命令来测试 各种各样的查询, 这些操作 也可以转换成客户端代码来实现调用。      

 

      

 

posted on 2019-03-07 11:59  天外来客cheng  阅读(435)  评论(0编辑  收藏  举报

导航