elasticsearch java客户端api使用(一)

1.客户端client构建

package com.pz998.app.service.utils; 

import static org.elasticsearch.common.settings.Settings.settingsBuilder; 

import java.net.InetSocketAddress; 

import org.elasticsearch.client.Client; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; public class SearchHelp { private static TransportClient client = null; public static Client getSearchClient() { if(client!=null){ return client; } Settings setting = settingsBuilder() //集群名称  .put("cluster.name", "es-cluster") .put("client.transport.sniff", true) .put("client.transport.ignore_cluster_name", false) .put("client.transport.ping_timeout", "5s") .put("client.transport.nodes_sampler_interval", "5s") .build(); client = TransportClient.builder().settings(setting).build(); ((TransportClient) client).addTransportAddress(new InetSocketTransportAddress(new InetSocketAddress("10.3.32.83", 9300))); return client; } } 

2.多字段检索

    public SearchResultVo queryDiseaseOrDoctor(SearchParam searchParam,Client client){     
        Integer from = searchParam.getFrom()==null?0:searchParam.getFrom(); 
        Integer size = searchParam.getPageSize()==null?0:searchParam.getPageSize(); MultiSearchResponse response = client.prepareMultiSearch() //搜索疾病索引  .add(client.prepareSearch(DISEASE_INDEX)// 检索的目录  .setSearchType(SearchType.DEFAULT)// Query type  .setQuery(QueryBuilders.disMaxQuery() .add(QueryBuilders.matchQuery("name", searchParam.getKeyword())) .add(QueryBuilders.matchQuery("intro", searchParam.getKeyword()) )) .addHighlightedField("name") .addHighlightedField("intro") .setHighlighterPreTags(FIELD_HIGHLIGHT_PRE_TAG) .setHighlighterPostTags(FIELD_HIGHLIGHT_POST_TAG) .setFrom(from).setSize(size).setExplain(true)) //搜索医生索引  .add(client.prepareSearch(DOCTOR_INDEX)// 检索的目录  .setSearchType(SearchType.DEFAULT)// Query type  .setQuery(QueryBuilders.disMaxQuery() .add(QueryBuilders.matchQuery("name", searchParam.getKeyword())) .add(QueryBuilders.matchQuery("disease_tag", searchParam.getKeyword())) //城市  // .add(QueryBuilders.matchQuery("city", searchParam.getCity()))  ) .addHighlightedField("name") .addHighlightedField("disease_tag") .setHighlighterPreTags(FIELD_HIGHLIGHT_PRE_TAG) .setHighlighterPostTags(FIELD_HIGHLIGHT_POST_TAG) .setFrom(from).setSize(size).setExplain(true)) .execute().actionGet();// 执行  SearchResultVo searchResultVo = new SearchResultVo(); List<BdDiseaseRpc> diseaseList = new ArrayList<BdDiseaseRpc>(); List<BdDoctorRpc> doctorList = new ArrayList<BdDoctorRpc>(); if(response.getResponses() != null) { MultiSearchResponse.Item diseaseItem = response.getResponses().length>0?(response.getResponses())[0]:null; MultiSearchResponse.Item doctorItem = response.getResponses().length>1?(response.getResponses())[1]:null; if(diseaseItem!=null){ SearchResponse diseasResp = diseaseItem.getResponse(); System.out.println("命中疾病条数: " + diseasResp.getHits().getTotalHits()); searchResultVo.setDiseaseTotal(diseasResp.getHits().getTotalHits()); for (SearchHit hits : diseasResp.getHits().getHits()) { Map<String, Object> sourceAsMap = hits.sourceAsMap(); //获取对应的高亮域  Map<String, HighlightField> result = hits.highlightFields(); //从设定的高亮域中取得指定域  HighlightField highlightFieldText = result.get("name"); String code = (String)sourceAsMap.get("code"); HighlightField introField = result.get("intro"); String name = getHighlightFieldText(highlightFieldText); name = StringUtils.isEmpty(name)?(String)sourceAsMap.get("name"):name; String intro = getHighlightFieldText(introField); intro = StringUtils.isEmpty(intro)?(String)sourceAsMap.get("intro"):intro; BdDiseaseRpc bdDiseaseRpc = new BdDiseaseRpc(); bdDiseaseRpc.setName(name); bdDiseaseRpc.setCode(code); bdDiseaseRpc.setIntro(intro); diseaseList.add(bdDiseaseRpc); } searchResultVo.setDiseaseList(diseaseList); } if(doctorItem!=null){ SearchResponse doctorResp = doctorItem.getResponse(); System.out.println("命中医生条数: " + doctorResp.getHits().getTotalHits()); searchResultVo.setDoctorTotal(doctorResp.getHits().getTotalHits()); for (SearchHit hits : doctorResp.getHits().getHits()) { Map<String, Object> sourceAsMap = hits.sourceAsMap(); //获取对应的高亮域  Map<String, HighlightField> result = hits.highlightFields(); //从设定的高亮域中取得指定域  HighlightField highlightFieldText = result.get("name"); String code = (String)sourceAsMap.get("code"); HighlightField diseaseTagField = result.get("disease_tag"); String name = getHighlightFieldText(highlightFieldText); name = StringUtils.isEmpty(name)?(String)sourceAsMap.get("name"):name; String diseaseTag = getHighlightFieldText(diseaseTagField); diseaseTag = StringUtils.isEmpty(diseaseTag)?(String)sourceAsMap.get("disease_tag"):diseaseTag; BdDoctorRpc bdDoctorRpc = new BdDoctorRpc(); bdDoctorRpc.setName(name); bdDoctorRpc.setCode(code); bdDoctorRpc.setDiseaseTag(diseaseTag); doctorList.add(bdDoctorRpc); } searchResultVo.setDoctorList(doctorList); } } return searchResultVo; } 

以上代码搜索疾病信息中的名字与简介, 同时搜索了disease和doctor两个索引


设置分页查询
.setFrom(from).setSize(size).setExplain(true))

3高亮信息
设置高亮显示信息首尾包裹的标签
    public static final String FIELD_HIGHLIGHT_PRE_TAG = "<span style=\"color:red\">"; 

    public static final String FIELD_HIGHLIGHT_POST_TAG = "</span>"; .setHighlighterPreTags(FIELD_HIGHLIGHT_PRE_TAG) .setHighlighterPostTags(FIELD_HIGHLIGHT_POST_TAG) ~ 
 
获取高亮显示的结果信息
//从设定的高亮域中取得指定域 
            HighlightField highlightFieldText = result.get("name");   
            String code = (String)sourceAsMap.get("code"); 
            HighlightField introField = result.get("intro"); 

            String highlight = getHighlightFieldText(highlightFieldText); 
            String intro = getHighlightFieldText(introField);
Elasticsearch 提供了官方的 Java 客户端,可以通过它与 Elasticsearch 服务器进行交互。下面是一个简单的示例,展示如何使用 Elasticsearch Java 客户端: 1. 首先,确保你已经在项目中添加了 Elasticsearch Java 客户端的依赖。你可以在 Maven 或 Gradle 中添加以下依赖项: Maven: ```xml <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.15.0</version> </dependency> ``` Gradle: ```groovy implementation 'org.elasticsearch.client:elasticsearch-rest-high-level-client:7.15.0' ``` 2. 在代码中创建 Elasticsearch 客户端实例: ```java import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http"))); ``` 请确保将 "localhost" 和 9200 替换为你的 Elasticsearch 服务器的主机和端口。 3. 使用客户端执行操作,例如执行搜索操作: ```java import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.index.query.QueryBuilders; SearchRequest searchRequest = new SearchRequest("your_index_name"); searchRequest.source().query(QueryBuilders.matchQuery("your_field_name", "your_search_keyword")); SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT); // 处理搜索响应 ``` 请将 "your_index_name" 替换为你的索引名称,将 "your_field_name" 替换为你要搜索的字段名称,将 "your_search_keyword" 替换为你要搜索的关键字。 这只是一个简单的示例,Elasticsearch Java 客户端提供了丰富的 API,可用于执行各种操作,如索引文档、更新文档、删除文档等。你可以参考 Elasticsearch Java 客户端的官方文档来了解更多信息:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/index.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值