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
- Elasticsearch搜索引擎学习记录4-1.6版本javaAPI
- ElasticSearch学习笔记-JavaAPI操作记录
- Elasticsearch搜索引擎学习记录1-安装
- Elasticsearch搜索引擎学习记录2-数据同步
- Elasticsearch搜索引擎学习记录3-分词器(analyzer)应用
- elasticsearch学习javaAPI:es简单搜索
- zookeeper学习记录-06 Zookeeper JavaAPI操作
- elasticsearch学习javaAPI:es的增删改查
- javaAPI连接Elasticsearch
- Elasticsearch JavaAPI 创建索引
- ElasticSearch javaAPI demo示例
- elasticsearch学习记录
- Elasticsearch安装学习记录
- ElasticSearch学习笔记 --- 搜索引擎技术选型对比
- ElasticSearch 搜索引擎
- Elasticsearch搜索引擎
- Elasticsearch搜索引擎
- ElasticSearch的javaAPI之Client
- 第五章 Oracle 数据类型及函数
- 【HDU 1709】【母函数】The Balance【给出n个砝码,以及n个砝码的重量,求出(1~sum)中(sum为各砝码总和)不能被称出的重量】
- Android—— Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系
- 1.thinkPHP简介和安装
- 纯代码和xib布局Button,使文字左图片右
- Elasticsearch搜索引擎学习记录4-1.6版本javaAPI
- 10月24号之前的总结
- Spring Boot 启动加载数据 CommandLineRunner
- Codeforces 607A Chain Reaction【dp】
- windows64位系统设置tomcat5.5开机启动服务
- Apple文档之FTP协议传输文件翻译
- 求奖金
- IOS 跳转至App Store 评分
- 【训练日记】20161024