elasticsearch分页列表查询
2016-07-03 00:00
791 查看
摘要: elasticsearch查询,按照搜索字符串精确匹配,按照搜索条件模糊查询,IK分词器分词查询,按照条件查询分页列表。
(1)分页查询
(2)拼接查询条件
(3)ElasticSearchTool 工具类
(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()); } } }
相关文章推荐
- 数据库分页查询语句数据库查询
- Oracle、MySQL和SqlServe三种数据库分页查询语句的区别介绍
- 巧用mysql提示符prompt清晰管理数据库的方法
- jquery向上向下取整适合分页查询
- 高效的SQLSERVER分页查询(推荐)
- 两大步骤教您开启MySQL 数据库远程登陆帐号的方法
- phpmyadmin 4+ 访问慢的解决方法
- linux系统下实现mysql热备份详细步骤(mysql主从复制)
- mysql、mssql及oracle分页查询方法详解
- CentOS 5.5下安装MySQL 5.5全过程分享
- SQL Server 分页查询通用存储过程(只做分页查询用)
- MySQL复制的概述、安装、故障、技巧、工具(火丁分享)
- MySQL中删除重复数据的简单方法
- mysql分页原理和高效率的mysql分页查询语句
- 完美实现bootstrap分页查询
- MySQL5.5.21安装配置教程(win7)
- Java操作MongoDB模糊查询和分页查询
- 使用ElasticSearch6.0快速实现全文搜索功能的示例代码
- elasticsearch批量数据导入和导出
- 使用ElasticSearch+LogStash+Kibana+Redis搭建日志管理服务