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;
}
比如我以“测试”二字做关键词搜索,出来的列表及关键字高亮如下: