您好,登录后才能下订单哦!
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; 
}免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。