您的位置:首页 > 其它

elasticsearch分页列表查询

2016-07-03 00:00 791 查看
摘要: elasticsearch查询,按照搜索字符串精确匹配,按照搜索条件模糊查询,IK分词器分词查询,按照条件查询分页列表。

(1)分页查询

/**
* @Description : 查询分页列表
* @param condtion
* @return
*/
public Page queryUserVoPage(SearchCondtion condtion){

Page page = new Page();

if(condtion == null) {
return page;
}

page.setPageSize(condtion.getLimit());
List<UserVo> users = new ArrayList<>();

BoolQueryBuilder boolQueryBuilder = null;

// 依据查询索引库名称创建查询索引
SearchRequestBuilder searchRequestBuilder = ElasticSearchTool.client.prepareSearch(ES_INDEX);
//设置查询文档,表名
searchRequestBuilder.setTypes(ES_TYPE_QUESTION);
//设置查询类型
searchRequestBuilder.setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
//设置分页信息
searchRequestBuilder.setFrom(condtion.getOffset()).setSize(condtion.getLimit());

//设置查询条件
boolQueryBuilder = getUserBuilder(condtion);

// 设置是否按查询匹配度排序
searchRequestBuilder.setExplain(true);

//排序
if(!StringUtils.isBlank(condtion.getOrderbyStr())){
if(condtion.getOrderbyStr().equals("score")){
searchRequestBuilder.addSort("score", SortOrder.DESC); //评分倒序
}else if(condtion.getOrderbyStr().equals("updatetime")){
searchRequestBuilder.addSort("updatetime", SortOrder.DESC); //更新时间倒序
}
}

SearchResponse response = searchRequestBuilder
.setQuery(boolQueryBuilder)
.execute()
.actionGet();
SearchHits hits = response.getHits();
page.setTotalCount((int)hits.getTotalHits());  //设置总记录数

for (SearchHit hit : response.getHits().getHits()) {
String fields = hit.getSourceAsString();
UserVo vo = gson.fromJson(fields,UserVo.class);
if(null != vo){
users.add(vo); //装换成功用户对象,添加到列表中
}
}
page.setPageData(questions);
return page;
}

(2)拼接查询条件

/**
* @Description : 拼接查询字段
* @param condtion
* @return
*/
private BoolQueryBuilder getUserBuilder(SearchCondtion condtion){
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolean flag = false;
if(null != condtion){
//用户状态
if(!StringUtils.isBlank(condtion.getStatus())){
//待审核,审核通过,审核未通过,精确匹配
boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("statusInfo", condtion.getStatus()));
flag = true;
}

//用户发布话题名称
if(!StringUtils.isBlank(condtion.getTopicName())){
//字符串匹配
QueryStringQueryBuilder qs = new QueryStringQueryBuilder(condtion.getTopicName());
qs.field("topicList.title");
boolQueryBuilder.must(qs);
}
//话题ID
if(null != condtion.getTopicId()){
//完全匹配
boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("topicList.id",condtion.getTopicId()));
flag = true;
}

//话题补充
if(!StringUtils.isBlank(condtion.getQuestionContent())){
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

QueryStringQueryBuilder queryBuilder = new QueryStringQueryBuilder(condtion.getQuestionContent());
queryBuilder.analyzer(ES_ANALYSIS_IK).field("content");
boolQuery.should(queryBuilder);

QueryStringQueryBuilder qs = new QueryStringQueryBuilder(condtion.getQuestionContent());
qs.field("content");
boolQuery.should(qs);

boolQueryBuilder.must(boolQuery);

//完全匹配
boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("content",condtion.getQuestionContent()));
flag = true;
}

//根据敏感词查询,IK分词器分词模糊查询
String sensitivewords = “约架,暴力”;
if(!StringUtils.isBlank(sensitivewords)){
QueryStringQueryBuilder queryBuilder = new QueryStringQueryBuilder(sensitivewords);
queryBuilder.analyzer(ES_ANALYSIS_IK).field("content");
boolQueryBuilder.should(queryBuilder).should(QueryBuilders.matchAllQuery());
flag = true;
}

}
if(!flag){
boolQueryBuilder.must(QueryBuilders.matchAllQuery());
}
return boolQueryBuilder;
}

(3)ElasticSearchTool 工具类

public class ElasticSearchTool {

private final static Logger logger = LoggerFactory.getLogger(ElasticSearchTool.class);

public static Client client = null;

/**
* @Description : 创建连接
* @return
*/
static {
try {
Settings settings = Settings.settingsBuilder().put(ES_CLUSTER_NAME,ES_CLUSTER_VALUE).build();
TransportClient build = TransportClient.builder()
.settings(settings)
.build();

logger.info("开始创建ES搜索服务器:"+ES_APPLICATION_ADDRESS+"的连接");
if (ES_APPLICATION_ADDRESS != null) {
String[] adds = ES_APPLICATION_ADDRESS.split(",");
for (String add : adds) {
String[] hostport = add.split(":");
build.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(hostport[0]), Integer.parseInt(hostport[1])));
}
}
client = build;
logger.info("成功创建ES搜索服务器:"+ES_APPLICATION_ADDRESS+"的连接");
} catch (UnknownHostException e) {
logger.info("创建ES搜索服务器:" + ES_APPLICATION_ADDRESS + "的连接失败," + e.toString());
}
}

/**
* @Description : 创建索引
* @param json  要建索引对象的json字符串
* @param ESIndex 索引名称
* @param ESType  索引类型(表名)
* @param id      索引id
*/
public static void createIndex(String json,String ESIndex,String ESType,String id){

logger.info("开始创建类型为:"+ESType+",id为:"+id+"的索引");
IndexResponse response = client.prepareIndex(ESIndex, ESType,id).setSource(json).get();
logger.info("成功创建类型为:"+ESType+",id为:"+id+"的索引");
}

/**
* @Description : 从索引中查询单条数据
* @param ESIndex 索引名称
* @param ESType  索引类型(表名)
* @param id      索引id
*/
public static String getIndexById(String ESIndex,String ESType,String id){
logger.info("查询id为:"+id+"的"+ESType+"索引数据");
String json = "";
GetResponse response = client.prepareGet(ESIndex, ESType, id).get();

if (response.isExists()) {   //检查文档是否存在
json = response.getSourceAsString();  //访问_source字段
logger.info("成功查询id为:"+id+"的"+ESType+"索引数据");
}
return json;
}

/**
* @Description :删除索引数据
* @param ESIndex 索引名称
* @param ESType  索引类型(表名)
* @param id      索引id
*/
public static void deleteIndexById(String ESIndex,String ESType,String id){
logger.info("开始删除id为:"+id+"的"+ESType+"索引数据");
DeleteResponse response = client.prepareDelete(ESIndex, ESType,id)
.get();
logger.info("成功删除id为:"+id+"的"+ESType+"索引数据");
}

/**
* @Description : 更新索引
* @param json  要更新索引对象的json字符串
* @param ESIndex 索引名称
* @param ESType  索引类型(表名)
* @param id      索引id
*/
public static void updateById(String json,String ESIndex,String ESType,String id){

logger.info("开始更新id为:"+id+"的"+ESType+"索引数据");

IndexRequest indexRequest = new IndexRequest(ESIndex, ESType,id).source(json);
UpdateRequest updateRequest = null;
try {
updateRequest = new UpdateRequest(ESIndex, ESType,id)
.doc(json)
.upsert(indexRequest);
client.update(updateRequest).get();
logger.info("成功更新id为:"+id+"的"+ESType+"索引数据");
} catch (Exception e) {
logger.info("更新id为:" + id + "的" + ESType + "索引数据失败," + e.toString());
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息