我的ElasticSearch集群的版本是6.2.4,导入elasticsearch相关的maven依赖也是6.2.4,不同版本的api可能会有差异
一:maven依赖
<!--elasticsearch核心依赖--> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>6.2.4</version> </dependency> <!--elasticsearch客户端--> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>6.2.4</version> </dependency> <!--日志--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-to-slf4j</artifactId> <version>2.9.1</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.24</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> <!--单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>compile</scope> </dependency> <!--实体转json--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.10.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.2</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.10.2</version> </dependency> <!--实体类简化工具--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.18</version> </dependency>
2.单元测试的共有方法
TransportClient client; @Before //创建连接 public void connection() throws UnknownHostException { //创建客户端连接对象 //参数为configelasticsearch.yml中对应的值 也就是集群名称 Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build(); client = new PreBuiltTransportClient(settings); client.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.118.3"), 9300)); client.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.118.4"), 9300)); client.addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.118.5"), 9300)); } @After //释放资源 public void close() { client.close(); } //遍历结果集 public void iteratorSearchHit(SearchHits searchHits) { System.out.println("符合查询条件有:" + searchHits.getTotalHits() + "条"); //获取迭代器 Iterator<SearchHit> iterator = searchHits.iterator(); System.out.println("开始进行遍历------------------------------"); while (iterator.hasNext()) { //获取每个查询对象 SearchHit searchHit = iterator.next(); //获取字符串类型并进行打印 System.out.println(searchHit.getSourceAsString()); Map<String, Object> sourceAsMap = searchHit.getSourceAsMap(); System.out.println("符合搜索条件的标题是:=======" + sourceAsMap.get("title")); /* for (Map.Entry<String,Object> map:sourceAsMap.entrySet()){ System.out.println("==================================="); System.out.println(map.getKey()); System.out.println(map.getValue()); } */ } }
3.常规操作
@Test //创建索引库 public void createIndex() { //索引名成必须小写 client.admin().indices().prepareCreate("myindex1").get(); } @Test //添加映射 public void mapping() throws IOException, ExecutionException, InterruptedException { XContentBuilder builder = XContentFactory.jsonBuilder().startObject() .startObject("type1") .startObject("properties") .startObject("id") .field("type", "integer") .field("store", "true") .endObject() .startObject("title") .field("type", "text") .field("store", "true") .field("analyzer", "ik_smart") .endObject() .startObject("content") .field("type", "text") .field("store", "true") .field("analyzer", "ik_smart") .endObject() .endObject() .endObject() .endObject(); PutMappingRequest mappingRequest = Requests.putMappingRequest("myindex1") .type("type1") .source(builder); client.admin().indices().putMapping(mappingRequest).get(); } @Test //给myindex1的type1创建文档 public void createDocument() throws IOException { XContentBuilder xContentBuilder = XContentFactory.jsonBuilder(); xContentBuilder.startObject() .field("id", 1) .field("title", "ElasticSearch是一个基于Lucene的搜索服务器") .field("content", "它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用 Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到 实时搜索,稳定,可靠,快速,安装使用方便。") .endObject(); //参数1:索引名 2:类型 3:id client.prepareIndex("myindex1", "type1", "1").setSource(xContentBuilder).get(); } @Test //通过实体转json创建文档 public void jsonDocument() throws JsonProcessingException { Type1 type1 = new Type1(); type1.setId(2); type1.setTitle("通过实体转json创建文档"); type1.setContent("通过创建实体的方式,将实体转json"); ObjectMapper objectMapper = new ObjectMapper(); client.prepareIndex("myindex1", "type1", type1.getId().toString()) .setSource(objectMapper.writeValueAsString(type1).getBytes(), XContentType.JSON) .get(); } @Test //关键词查询 public void termQuery() { //设置搜索条件,目标索引库,目标类型,目标域 SearchResponse searchResponse = client.prepareSearch("myindex1") .setTypes("type1") .setQuery(QueryBuilders.termQuery("content", "实体")).get(); SearchHits hits = searchResponse.getHits(); iteratorSearchHit(hits); } @Test //字符串查询 public void stringQuery() { //设置搜索条件,目标索引库,目标类型 SearchResponse searchResponse = client.prepareSearch("myindex1") .setTypes("type1") .setQuery(QueryBuilders.queryStringQuery("搜索实体")).get(); SearchHits hits = searchResponse.getHits(); iteratorSearchHit(hits); } @Test //根据文档ID进行查询 public void idQuery() { SearchResponse searchResponse = client.prepareSearch("myindex1") .setQuery(QueryBuilders.idsQuery("type1").addIds("2")) .get(); iteratorSearchHit(searchResponse.getHits()); } //分页之前的操作,批量添加文档 @Test public void batchInsert() throws JsonProcessingException { Type1 type1; for (int i = 1; i <= 50; i++) { type1 = new Type1(); type1.setId(i); type1.setTitle(i + "通过实体转json创建文档"); type1.setContent(i + "通过创建实体的方式,将实体转json"); ObjectMapper objectMapper = new ObjectMapper(); client.prepareIndex("myindex1", "type1", type1.getId().toString()) .setSource(objectMapper.writeValueAsString(type1).getBytes(), XContentType.JSON) .get(); } } //搜索文档并分页显示 @Test public void pageDocument() { SearchResponse searchResponse = client.prepareSearch("myindex1") .setTypes("type1") .setQuery(QueryBuilders.matchAllQuery()) //setFrom():从第几条开始检索,默认是0。 // setSize():每页最多显示的记录数默认是十 .setFrom(0) .setSize(5) .get(); iteratorSearchHit(searchResponse.getHits()); } //模拟搜索结果高亮显示 @Test public void highlight() { //设置查询条件 SearchRequestBuilder searchRequestBuilder = client.prepareSearch("myindex1") .setTypes("type1") .setQuery(QueryBuilders.termQuery("title", "实体")); //高亮设置 HighlightBuilder highlightBuilder = new HighlightBuilder(); //开头的标签信息 highlightBuilder.preTags("<font style='color:red'>"); //结尾的标签 highlightBuilder.postTags("</font>"); highlightBuilder.field("title"); searchRequestBuilder.highlighter(highlightBuilder); SearchResponse searchResponse = searchRequestBuilder.get(); Iterator<SearchHit> iterator = searchResponse.getHits().iterator(); while (iterator.hasNext()) { SearchHit hit = iterator.next(); System.out.print("正常String方式打印文档搜索内容===="); System.out.println(hit.getSourceAsString()); Map<String, HighlightField> highlightFields = hit.getHighlightFields(); //遍历集合,输出高亮数据 //方式1 Text[] titles = highlightFields.get("title").getFragments(); for (Text str : titles) { System.out.println(str); } } }