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检索
三. 官方包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 的规则命令来测试 各种各样的查询, 这些操作 也可以转换成客户端代码来实现调用。