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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值