zoukankan      html  css  js  c++  java
  • 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);
    
  • 相关阅读:
    c++ 内存管理
    socket粘包现象加解决办法
    TCP与UDP比较 以及并发编程基础知识
    进程之 Process join方法其他属性与进程Queue
    socket通讯实例与TCP/UDP的区别
    socket介绍
    python中的异常处理机制
    面向对象之多态,多态性,反射,以及基于反射的可拔插设计
    面向对象之元类介绍
    面向对象基础
  • 原文地址:https://www.cnblogs.com/austinspark-jessylu/p/7837818.html
Copyright © 2011-2022 走看看