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; 
    }

 

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

 

 

设置分页查询

.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);

    public String getHighlightFieldText(HighlightField highlightFieldText){ 
        if(highlightFieldText==null){ 
            return ""; 
        } 
        //取得定义的高亮标签 
        Text[] higlightTexts =  highlightFieldText.fragments(); 

        //为title串值增加自定义的高亮标签 
        String higlightText = "";   
        for(Text text : higlightTexts){     
            higlightText += text;   
        } 
        return higlightText; 
    }

--------------

学习视频

 

复制链接,在浏览器打开
tomcat源码解析
https://study.163.com/course/introduction/1209535854.htm

Springmvc源码解析
https://study.163.com/course/introduction/1209536851.htm

dubbo源码解析
https://study.163.com/course/introduction/1209648816.htm

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值