Elasticsearch搜索引擎学习记录4-1.6版本javaAPI

来源:互联网 发布:ios编程 第四版 微盘 编辑:程序博客网 时间:2024/06/10 01:11

elasticsearch 的javaAPI操作文档很多,我简单记录一下,没有涉及到具体语法分析,但是样例里基本都有涉及,详细的请自行百度

  • 加入依赖
<es.version>1.6.0</es.version><dependency>    <groupId>org.elasticsearch</groupId>    <artifactId>elasticsearch</artifactId>    <version>${es.version}</version></dependency>
  • 获取客户端连接
import org.elasticsearch.client.Client;import org.elasticsearch.client.transport.TransportClient;import org.elasticsearch.common.settings.ImmutableSettings;import org.elasticsearch.common.settings.Settings;import org.elasticsearch.common.transport.InetSocketTransportAddress;import org.springframework.beans.factory.DisposableBean;/** * 初始化ESClient * * @createTime 2016/10/29 11:29 */public class ESClient implements DisposableBean {    protected Client client;    protected String hosts;    protected String cluster;    public String getHosts() {        return hosts;    }    public void setHosts(String hosts) {        this.hosts = hosts;    }    public String getCluster() {        return cluster;    }    public void setCluster(String cluster) {        this.cluster = cluster;    }    public ESClient() {        super();    }    public ESClient(String hosts,String cluster) {        super();        this.hosts = hosts;        this.cluster = cluster;        this.init(this.hosts, this.cluster);    }    public void init(String hosts,String cluster) {        String hostname;        int port = 9300;        // TODO Auto-generated method stub        Settings settings = ImmutableSettings.settingsBuilder()                .put("client.transport.sniff", false)                .put("cluster.name", cluster)                .build();        TransportClient transportClient = new TransportClient(settings);        String[]  addresses = hosts.split(",");        for (String addr : addresses) {            String[] oneAddress = addr.split(":");            hostname = oneAddress[0];            port = Integer.valueOf(oneAddress[1]);            transportClient.addTransportAddress(                    new InetSocketTransportAddress(hostname, port));        }        client = transportClient;    }    @Override    public void destroy() throws Exception {        client.close();    }    public Client getClient() {        return client;    }    public void setClient(Client client) {        this.client = client;    }   }
  • 关键字搜索
@Override    public List<SearchLog> searchKeyWord(String keyword) {        List<SearchLog> searchLogs = new ArrayList<>();        String index = PropertiesCacheUtil.getValue(ESkeys.KEYWORD_INDEX, PropertieNameConts.ES);        // FIXME 需要改造一下指定集群名称,避免集群重复        SearchRequestBuilder requestBuilder = SearchClient.getClient().prepareSearch(index).setTypes("kws").setSearchType(SearchType.DFS_QUERY_THEN_FETCH);        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();        boolQueryBuilder.should(QueryBuilders.prefixQuery("keyword", keyword));        //多字段匹配        boolQueryBuilder.should(QueryBuilders.multiMatchQuery(keyword, "keyword", "pinyin", "prefixpinyin"));        requestBuilder.setQuery(QueryBuilders.boolQuery().must(boolQueryBuilder)).addSort("_score",SortOrder.DESC);             SearchResponse response = requestBuilder.setFrom(0).setSize(Integer.MAX_VALUE).setExplain(true).execute().actionGet();        SearchHit[] searchHit = response.getHits().getHits();        LinkedHashMap<String,String> map = new LinkedHashMap<String,String>();        //全文搜索代码去重 取前10条         for (SearchHit searchHit2 : searchHit) {              String keyWord = searchHit2.getSource().get("keyword").toString();             if(!map.keySet().contains(keyWord)){                 map.put(keyWord,keyWord);             }             if(map.size()>=10){                 break;             }        }        for(String m:map.keySet()){            SearchLog _SearchLog = new SearchLog();             _SearchLog.setKeyWord(m);             searchLogs.add(_SearchLog);        }         return searchLogs;}
  • 列表查询,并高亮显示
public List<ResourceVo> search(SearchCondition searchCondition) {List<ResourceVo> list = new ArrayList<>();String index = PropertiesCacheUtil.getValue(ESkeys.INDEX, PropertieNameConts.ES);SearchRequestBuilder requestBuilder = SearchClient.getClient().prepareSearch(index.split(",")).setTypes("rsource").setSearchType(SearchType.DFS_QUERY_THEN_FETCH);List<FilterBuilder> termFilterBuilders = new ArrayList<>();if (StringUtil.isNotEmpty(searchCondition.getGradeCd())) {termFilterBuilders.add(FilterBuilders.termFilter("grade_cd", searchCondition.getGradeCd()));}if (StringUtil.isNotEmpty(searchCondition.getSubjectCd())) {termFilterBuilders.add(FilterBuilders.termFilter("subject_cd", searchCondition.getSubjectCd()));}BoolQueryBuilder queryBuilders = new BoolQueryBuilder();if(StringUtils.isNotBlank(searchCondition.getKeyWord())){queryBuilders.must(QueryBuilders.multiMatchQuery(searchCondition.getKeyWord(), "res_name", "res_desc", "key_word"));}requestBuilder.setQuery(queryBuilders);FilterBuilder[] filterBuilderArray = new FilterBuilder[termFilterBuilders.size()];termFilterBuilders.toArray(filterBuilderArray);requestBuilder.setPostFilter(FilterBuilders.andFilter(filterBuilderArray));//高亮显示关键字requestBuilder.addHighlightedField("res_name");requestBuilder.addHighlightedField("res_desc");requestBuilder.addHighlightedField("key_word");requestBuilder.setHighlighterEncoder("UTF-8");requestBuilder.setHighlighterPreTags("<span class=\"light-blue\">");requestBuilder.setHighlighterPostTags("</span>");SearchResponse response = requestBuilder.setFrom(searchCondition.getStartSize()).setSize(searchCondition.getPageSize()).setExplain(true).execute().actionGet();SearchHits searchHits = response.getHits();SearchHit[] searchHit = searchHits.getHits();for (SearchHit searchHit2 : searchHit) {// 获取对应的高亮域Map<String, HighlightField> result = searchHit2.highlightFields();// 从设定的高亮域中取得指定域HighlightField res_name = result.get("res_name");HighlightField res_desc = result.get("res_desc");HighlightField key_word = result.get("key_word");Map<String,Object> map = searchHit2.getSource();// 重新组装resourceVo对象ResourceVo resourceVo = this.rePackResource(map);if (resourceVo != null) {if (res_name != null) {resourceVo.setResName(getHighlightText(res_name));}if (res_desc != null) {resourceVo.setResDesc(getHighlightText(res_desc));}if (key_word != null) {resourceVo.setKeyWord(getHighlightText(key_word));}list.add(resourceVo);}}searchCondition.setTotalCount((int) searchHits.getTotalHits());return list;}
private String getHighlightText(HighlightField titleField) {        // 取得定义的高亮标签        org.elasticsearch.common.text.Text[] titleTexts = titleField.fragments();        // 为title串值增加自定义的高亮标签        String title = "";        for (org.elasticsearch.common.text.Text text : titleTexts) {            title += text;        }        return title;    }

比如我以“测试”二字做关键词搜索,出来的列表及关键字高亮如下:
这里写图片描述

0 0