1.es-java连接池
import io.searchbox.client.JestClientFactory;
import io.searchbox.client.config.HttpClientConfig;
import io.searchbox.client.http.JestHttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.Collections;
import java.util.LinkedHashSet;
/**
* Author:me
* Date:2018/12/21
*/
@Component
public class ESFactory {
private static JestHttpClient client;
private static final LinkedHashSet servers = new LinkedHashSet();
//es节点 ip:port,ip:port......
@Value("${es.conn}")
private String esConn;
@PostConstruct
public void init() {
if (client == null) {
Collections.addAll(servers, esConn.split(","));
}
}
public JestHttpClient getClient() {
try {
if (client == null) {
synchronized (ESFactory.class) {
if (client == null) {
JestClientFactory factory = new JestClientFactory();
factory.setHttpClientConfig(new HttpClientConfig.Builder(servers).defaultMaxTotalConnectionPerRoute(2000).maxTotalConnection(5000).connTimeout(3000).readTimeout(3000).multiThreaded(true).build());
client = (JestHttpClient) factory.getObject();
}
}
}
return client;
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
}
2.es-java-service实例
import com.alibaba.fastjson.JSONObject;
import io.searchbox.client.JestResult;
import io.searchbox.core.*;
import io.searchbox.params.Parameters;
import io.searchbox.params.SearchType;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.Map;
/**
* Author:me
* Date:2018/12/21
*/
@Component
public class ESService {
private static Logger LogUtil = LoggerFactory.getLogger(ESFactory.class);
@Autowired
private ESFactory esFactory;
/**
* 新增
* @param index 索引
* @param type 类型
* @param docId 组件id
* @param bodys dsl
* @return
*/
public JestResult add(String index, String type,String docId, String... bodys) {
JestResult jestResult = null;
try {
Bulk.Builder bulkBuilder = new Bulk.Builder();
for (String body : bodys) {
Index builder = new Index.Builder(body).index(index).type(type).id(docId).build();
bulkBuilder.addAction(builder);
}
jestResult = esFactory.getClient().execute(bulkBuilder.build());
if (jestResult != null) {
LogUtil.debug(
StringUtils.join(
new String[]{
"add",
index,
type,
bodys.toString(),
jestResult.getErrorMessage(),
String.valueOf(jestResult.getResponseCode()),
String.valueOf(jestResult.isSucceeded())},
"------")
);
}
} catch (Exception ex) {
LogUtil.error(ex.getMessage(), ex);
}
return jestResult;
}
/**
* 删除
* @param index 索引
* @param type 类型
* @param id doc-id
* @return
*/
public JestResult del(String index, String type, String id) {
JestResult jestResult = null;
try {
Delete builder = new Delete.Builder(id).index(index).type(type).build();
jestResult = esFactory.getClient().execute(builder);
if (jestResult != null) {
LogUtil.debug(
StringUtils.join(
new String[]{
"del",
index,
type,
id,
jestResult.getErrorMessage(),
String.valueOf(jestResult.getResponseCode()),
String.valueOf(jestResult.isSucceeded())},
"------")
);
}
} catch (Exception ex) {
LogUtil.error(ex.getMessage(), ex);
}
return jestResult;
}
/**
* 默认更新,不重试
* @param index 索引
* @param type 类型
* @param id id
* @param upsertScript 更新脚本
* @return
*/
public JestResult upsert(String index, String type, String id, String upsertScript) {
return upsert(index, type, id, upsertScript, 2);
}
/**
*
* @param index 索引
* @param type 类型
* @param id id
* @param upsertScript 更新脚本
* @param retry_on_conflict 失败重试
* @return
*/
public JestResult upsert(String index, String type, String id, String upsertScript, int retry_on_conflict) {
JestResult result = null;
LogUtil.info("upsert....upsertScript...:index="+index+",type="+type+",id="+id+",upsertScript="+upsertScript);
try {
Update update = new Update.Builder(upsertScript).index(index).type(type).id(id).setParameter(Parameters.RETRY_ON_CONFLICT, retry_on_conflict).build();
result = esFactory.getClient().execute(update);
if (!result.isSucceeded()) {
throw new Exception(upsertScript + ":ES " + result.getErrorMessage());
}
if (result != null) {
LogUtil.debug(
StringUtils.join(
new String[]{
"upsert",
index,
type,
upsertScript,
result.getErrorMessage(),
String.valueOf(result.getResponseCode()),
String.valueOf(result.isSucceeded())},
"------"
)
);
}
} catch (Exception e) {
LogUtil.error(e.getMessage(), e);
}
return result;
}
/**
* 自定义查询
* @param index 索引
* @param type 类型
* @param dsl dsl
* @return
*/
public SearchResult search(String index, String type, String dsl) {
SearchResult searchResult = null;
try {
Search search = new Search.Builder(dsl)
.addIndex(index)
.addType(type)
.build();
searchResult = esFactory.getClient().execute(search);
if (searchResult != null) {
// LogUtil.info("search...jestResult:" + JSONObject.toJSONString(jestResult));
LogUtil.debug(
StringUtils.join(
new String[]{
"query",
index,
type,
dsl,
searchResult.getErrorMessage(),
String.valueOf(searchResult.getResponseCode()),
String.valueOf(searchResult.isSucceeded())},
"------")
);
}
} catch (Exception e) {
LogUtil.error(e.getMessage(), e);
}
return searchResult;
}
public JestResult bulkUpsert(String index, String type, int retry_on_conflict, Map upsertScript) {
JestResult jestResult = null;
if (upsertScript == null || upsertScript.size() == 0) {
return jestResult;
}
try {
Bulk.Builder bulkBuilder = new Bulk.Builder();
for (Map.Entry script : upsertScript.entrySet()) {
Update update = new Update.Builder(script.getValue()).index(index).type(type).id(script.getKey()).setParameter(Parameters.RETRY_ON_CONFLICT, retry_on_conflict).build();
bulkBuilder.addAction(update);
}
jestResult = esFactory.getClient().execute(bulkBuilder.build());
if (jestResult != null) {
LogUtil.debug(
StringUtils.join(
new String[]{
"bulkUpsert",
index,
type,
upsertScript.toString(),
jestResult.getErrorMessage(),
String.valueOf(jestResult.getResponseCode()),
String.valueOf(jestResult.isSucceeded())},
"------")
);
}
} catch (Exception ex) {
LogUtil.error(ex.getMessage(), ex);
}
return jestResult;
}
public SearchResult scrollQuery(String queryBody, String index, String type, Integer size) {
SearchResult searchResult = null;
try {
Search search = new Search.Builder(queryBody)
.addIndex(index)
.addType(type)
.setParameter(Parameters.SIZE, size)
.setParameter(Parameters.SCROLL, "1m")
.setSearchType(SearchType.SCAN)
.build();
searchResult = esFactory.getClient().execute(search);
if (searchResult != null) {
LogUtil.debug(
StringUtils.join(
new String[]{
"scrollQuery",
index,
type,
queryBody,
searchResult.getErrorMessage(),
String.valueOf(searchResult.getResponseCode()),
String.valueOf(searchResult.isSucceeded())},
"------")
);
}
} catch (Exception e) {
LogUtil.error(e.getMessage(), e);
}
return searchResult;
}
public JestResult scrollQuery(String scroll_id, Integer size) {
JestResult jestResult = null;
try {
SearchScroll searchScroll = new SearchScroll.Builder(scroll_id, "1m").build();
jestResult = esFactory.getClient().execute(searchScroll);
if (jestResult != null) {
LogUtil.debug(
StringUtils.join(
new String[]{
"scrollQuery",
scroll_id,
jestResult.getErrorMessage(),
String.valueOf(jestResult.getResponseCode()),
String.valueOf(jestResult.isSucceeded())},
"------")
);
}
} catch (Exception e) {
LogUtil.error(e.getMessage(), e);
}
return jestResult;
}
public JestResult delByQuery(String index, String type, String query) {
JestResult result = null;
try {
DeleteByQuery deleteByQuery = new DeleteByQuery.Builder(query)
.addIndex(index)
.addType(type)
.build();
result = esFactory.getClient().execute(deleteByQuery);
if (result != null) {
LogUtil.debug(
StringUtils.join(
new String[]{
"delByQuery",
index,
type,
query,
result.getErrorMessage(),
String.valueOf(result.getResponseCode()),
String.valueOf(result.isSucceeded())},
"------")
);
}
} catch (Exception ex) {
LogUtil.error(ex.getMessage(), ex);
}
return result;
}
public JestResult searchCount(String index, String type, String dsl) {
JestResult jestResult = null;
try {
Search search = new Search.Builder(dsl)
.setSearchType(SearchType.COUNT)
.addIndex(index)
.addType(type)
.build();
jestResult = esFactory.getClient().execute(search);
if (jestResult != null) {
LogUtil.debug(
StringUtils.join(
new String[]{
"query",
index,
type,
dsl,
jestResult.getErrorMessage(),
String.valueOf(jestResult.getResponseCode()),
String.valueOf(jestResult.isSucceeded())},
"------")
);
}
} catch (Exception e) {
LogUtil.error(e.getMessage(), e);
}
return jestResult;
}
/**
* 建议搜索
* @param index
* @param type
* @param dsl
*/
public SuggestResult suggest(String index, String type,String dsl){
SuggestResult suggestResult = null;
try {
Suggest suggest=new Suggest.Builder(dsl).addIndex(index)
//.addType(type)
.build();
suggestResult= esFactory.getClient().execute(suggest);
} catch (IOException e) {
LogUtil.error(e.getMessage(), e);
}
return suggestResult;
}
}
3.es搜索语句实例
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.app.server.common.config.ConfigCenter;
import com.es.common.TableConstant;
import com.fastjson.JSON;
import com.viewworld.common.constants.ESEnums;
import com.viewworld.common.utils.PageResult;
import com.viewworld.dao.IComponentInfoDao;
import com.viewworld.dao.IComponentInfoNativeDao;
import com.viewworld.domain.dto.ComponentInfoTypeDto;
import com.viewworld.domain.entity.ComponentDetailInfoEntity;
import com.viewworld.domain.entity.ComponentInfoEntity;
import com.viewworld.domain.entity.ErpInfoDto;
import com.viewworld.service.IComponentEsService;
import com.viewworld.service.RangkingDao;
import com.viewworld.service.elasticSearch.ESService;
import entity.ComponentSearch;
import io.searchbox.client.JestResult;
import io.searchbox.core.SuggestResult;
import io.searchbox.core.SuggestResult.Suggestion;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.search.suggest.SuggestBuilder;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import sun.font.Script;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* Author:
* Date:2018/12/21
* */
@Service
public class ComponentEsServiceImpl implements IComponentEsService {
private static Logger log = LoggerFactory.getLogger(ComponentEsServiceImpl.class);
@Autowired
ESService esService;
@Autowired
ConfigCenter configCenter;
@Autowired
IComponentInfoDao componentInfoDao;
@Autowired
private IComponentInfoNativeDao componentInfoNativeDao;
@Autowired
private RangkingDao rangkingDao;
/**
* 提示词map
* key :suggestName
* value:suggestField
*/
private Map suggestFieldMap;
public ComponentEsServiceImpl(){
super();
suggestFieldMap = new HashMap();
suggestFieldMap.put("suggest-name", "name.completion");//中文提示
suggestFieldMap.put("suggest-cname", "cname.completion");//英文提示
suggestFieldMap.put("suggest-departName", "departName.completion");//部门提示
}
/**
* es分页查询组件信息
* @param domainId 领域id
* @param keyword 关键词
* @param pageNumber 起始页
* @param pageSize 分页大小
* @return
*/
public PageResult list(Integer domainId, final String keyword, Integer compontentTypeId, int pageNumber, int pageSize) {
PageResult page = new PageResult();
List appList = new ArrayList();
try{
String filterIds = configCenter.getBusinessConfigValueByKey("filter.domain.ids");
//字段分词匹配
String dsl = buildQuery(keyword,domainId,pageNumber,pageSize,compontentTypeId,filterIds);
//各字段精确匹配
String termDsl = buildTermQuery(keyword,domainId,pageNumber,pageSize,compontentTypeId,filterIds);
log.info("es...list...dsl="+dsl);
log.info("es...list...termDsl="+termDsl);
if(isTermMatch(domainId, keyword, compontentTypeId)){
dsl = termDsl;
}
JestResult result = esService.search(TableConstant.INDEX, TableConstant.Tables.COMPONENT_INFO.value(),dsl);
JsonArray respArray = result.getJsonObject().getAsJsonObject("hits").getAsJsonArray("hits");
long total=result.getJsonObject().getAsJsonObject("hits").get("total").getAsLong();
if (respArray.size() > 0) {
for(int i=0;i 0){
return true;
}
return false;
}
/**
* 新增
* @param dto
*/
public void add(ComponentInfoTypeDto dto) {
try {
String dsl = JSONObject.toJSONString(dto);
String docId = String.valueOf(dto.getcId());
esService.add(TableConstant.INDEX, TableConstant.Tables.COMPONENT_INFO.value(),docId, dsl);
} catch (Exception e) {
e.printStackTrace();
log.error("add...es新增错误", e);
}
}
/**
* 删除
* @param docId
*/
public void del(String docId) {
try {
esService.del(TableConstant.INDEX, TableConstant.Tables.COMPONENT_INFO.value(),docId);
} catch (Exception e) {
e.printStackTrace();
log.error("del...es删除错误", e);
}
}
/**
* 更新
* @param dto
*/
public void update(ComponentInfoTypeDto dto) {
try {
String id = String.valueOf(dto.getcId());
String dsl = JSONObject.toJSONString(dto);
log.info("dsl...update..."+dsl);
String script = upsertDsl(dsl);
esService.upsert(TableConstant.INDEX, TableConstant.Tables.COMPONENT_INFO.value(),id,script);
} catch (Exception e) {
e.printStackTrace();
log.error("update...es修改错误", e);
}
}
@Override
public List suggest(String keyword, int size) {
if(StringUtils.isEmpty(keyword)||size<=0){
return Collections.EMPTY_LIST;
}
List listSuggestWord = new ArrayList();
SuggestBuilder suggestBuilder=new SuggestBuilder();
suggestBuilder.setText(keyword);
for(Entry entry:suggestFieldMap.entrySet()){
//中文提示
CompletionSuggestionBuilder itemSuggest = new CompletionSuggestionBuilder(entry.getKey());
itemSuggest.field(entry.getValue());
itemSuggest.size(size);
suggestBuilder.addSuggestion(itemSuggest);
}
SuggestResult suggestResult=esService.suggest(TableConstant.INDEX, TableConstant.Tables.COMPONENT_INFO.value(), suggestBuilder.toString());
for(Entry entry:suggestFieldMap.entrySet()){
List suggestionList = suggestResult.getSuggestions(entry.getKey());
for(SuggestResult.Suggestion suggestion:suggestionList){
if(suggestion==null){
continue;
}
List