Java查询es数据,根据指定id检索(in查询),sql权限过滤,多字段匹配检索,数据排序

这篇具有很好参考价值的文章主要介绍了Java查询es数据,根据指定id检索(in查询),sql权限过滤,多字段匹配检索,数据排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java集成Elasticsearch数据查询

Java集成Elasticsearch,进行索引数据查询,并进行sql权限过滤,指定id检索(in查询),多字段匹配检索,数据排序。由于权限过滤是根据sql语句判断当前用户或其部门可查询的数据,所以采用以下方法:
1.通过sql过滤出当前用户可查询的数据id集合idsList;
2.将当前用户可查询的数据id集合idsList通过QueryBuilders.idsQuery()进行查询,类似Mysql的in (’ ‘,’ ‘,’ ')查询。

Java代码

1.action代码

	public void sq_list(){
		//获取数据
		PrintWriter writer = null;
		//建立连接
		RestHighLevelClient restHighLevelClient = RestHighLevelClientFactory.getHighLevelClient();
		try {
			writer = this.getResponse().getWriter();
			//设置请求和响应相关参数
			ResponseUtil.setResponseParam(this.getResponse(), this.getRequest());
			//接收参数
			Map<String,String> paramMap = RequestParamUtilOA.getParameterMap(this.getRequest());
			String userId =this.getUserId();
			paramMap.put("userId", userId);
			String pageStr = paramMap.get("page");
			String rowsStr = paramMap.get("rows");
			
			int page = Integer.parseInt(pageStr);
			int rows = Integer.parseInt(rowsStr);
			paramMap.put("page", Integer.valueOf(page).toString());
			paramMap.put("rows", Integer.valueOf(rows).toString());
			
			String esSearch = paramMap.get("esSearch");
			if (StringUtils.isNotBlank(esSearch)) {
				Map<String, Object> searchMatchFw = indexTestService.searchMatchFw(AppParameters.index_name_fw, AppParameters.index_type_fw, paramMap, restHighLevelClient);
				List<ZtxmOaFwSq> fwList = (List<ZtxmOaFwSq>)searchMatchFw.get("rows");
				int total = Integer.valueOf(searchMatchFw.get("total").toString());
				String resData = ztxmOaFwSqService.getZtxmOaFwSqPageJson(fwList, userId);
				writer.write("{\"resCode\":\"10\",\"resMsg\":\"查询成功\",\"total\":" + total + ",\"rows\":" + resData + "}");
			} else {
				writer.write("{\"resCode\":\"10\",\"resMsg\":\"查询成功\",\"total\":0,\"rows\":[]}");
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			writer.write("{\"resCode\":\"30\",\"resMsg\":\"查询失败\"}");
		} finally {
			//关闭连接
            try {
            	restHighLevelClient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
	}

2.service代码

	/**
	 * 全文检索
	 * @param index
	 * @param type
	 * @param paramMap
	 * @param rhclient
	 * @return
	 * @throws IOException
	 */
    public Map<String, Object> searchMatchFw(String index, String type, Map<String,String> paramMap, RestHighLevelClient rhclient) throws IOException;
    

3.serviceImpl代码

1.通过QueryBuilders.idsQuery()进行类似Mysql的in (’ ‘,’ ‘,’ ')查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.idsQuery().addIds(idsList.toArray(new String[]{})));
sourceBuilder.query(boolQueryBuilder);

2.索引多字段匹配数据查询
boolQueryBuilder.must(QueryBuilders.multiMatchQuery(esSearch, keySetArray).slop(0).type(“phrase”));

3.排序构建器:按照索引指定字段进行倒序排序
FieldSortBuilder sortBuilder = SortBuilders.fieldSort(“sqTjsj”).order(SortOrder.DESC);
sourceBuilder.sort(sortBuilder);文章来源地址https://www.toymoban.com/news/detail-835225.html

	/**
	 * 全文检索
	 */
	@Override
	public Map<String, Object> searchMatchFw(String index, String type, Map<String, String> paramMap, RestHighLevelClient rhclient) throws IOException {
		Map<String, Object> map = new HashMap<String, Object>();
		
		String esSearch = paramMap.get("esSearch");
		String fullMath = paramMap.get("fullMath");
		Integer page = null;
		Integer rows = null;
		String pageStr = paramMap.get("page");
		String rowsStr = paramMap.get("rows");
		if (StringUtils.isNotBlank(pageStr) && StringUtils.isNotBlank(rowsStr)) {
			page = parseIntegerValue(pageStr, 1);
			rows = parseIntegerValue(rowsStr, 1);
		}
		SearchRequest searchRequest = new SearchRequest(index);
		searchRequest.types(type);

		//搜索字段
		Set<String> keySet = new HashSet<>();
		String[] keySetArray = {};
		// 获得字典组map对象
		Map<String, Map<String, Map<String, String>>> dataDicGroupToItemMap = AmcInterface.getDataDicGroupToItemMap();
		if (dataDicGroupToItemMap != null) {
			// 获得字典组代码对应的全部字典项map对象
			Map<String, Map<String, String>> zidianxMap = dataDicGroupToItemMap.get("AMC_OA_es_fw");
			if (zidianxMap != null) {
				keySet = zidianxMap.keySet();
				keySetArray = keySet.toArray(new String[keySet.size()]);
				/*if ("0".equals(fullMath)) {
					sourceBuilder.query(QueryBuilders.multiMatchQuery(esSearch, keySetArray).slop(0).type("phrase"));
				}else {
					sourceBuilder.query(QueryBuilders.multiMatchQuery(esSearch, keySetArray));
				}*/
			}
		}
		
		SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

		//获取符合当前用户权限的发文id信息:通过sql过滤出当前用户可查询的数据id集合
		List<String> idsList = getFwSqListIds(paramMap);
		logger.info("列表查询:符合用户权限的id数量: "+idsList.size());
		
		//查询参数设置
		BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
		//将当前用户可查询的数据id集合通过QueryBuilders.idsQuery()进行in查询
		if (idsList != null && idsList.size() > 0) {		
			boolQueryBuilder.must(QueryBuilders.idsQuery().addIds(idsList.toArray(new String[]{})));
		}
		//索引多字段匹配数据查询
		if (keySetArray != null && keySetArray.length > 0) {
			boolQueryBuilder.must(QueryBuilders.multiMatchQuery(esSearch, keySetArray).slop(0).type("phrase"));		
		}
		sourceBuilder.query(boolQueryBuilder);
        
        //排序构建器设置:按照索引数据的提交时间倒序排序
        FieldSortBuilder sortBuilder = SortBuilders.fieldSort("sqTjsj").order(SortOrder.DESC);
        sourceBuilder.sort(sortBuilder);
        
        //基础参数设置
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        sourceBuilder.size(5000);//默认查询10条数据
        
        //设置高亮显示
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        for(String key : keySet){
        	highlightBuilder.field(key);
        }
        highlightBuilder.requireFieldMatch(false);
        highlightBuilder.preTags("<span style=\"color:red\">");
        highlightBuilder.postTags("</span>");
        sourceBuilder.highlighter(highlightBuilder);
        
        //将请求体加入到请求中
        searchRequest.source(sourceBuilder);

        //发送请求
        SearchResponse searchResponse = rhclient.search(searchRequest, RequestOptions.DEFAULT);

        //处理搜索命中文档结果
        SearchHits hits = searchResponse.getHits();
        logger.info("es search total hits: " + hits.getTotalHits().value);
        SearchHit[] searchHits = hits.getHits();
        
        int total = 0;
        List<ZtxmOaFwSq> ztxmOaFwSqList = new ArrayList<ZtxmOaFwSq>();
        if (searchHits != null && searchHits.length > 0) {
        	//总条数
        	total = searchHits.length;
        	//分页信息
        	int begin = 0;
        	int sum = searchHits.length;
        	if (page != null && rows != null) {
				if (page * rows <= searchHits.length) {
					begin = (page - 1) * rows;
					sum = begin + rows;
				}else {
					begin = (page - 1) * rows;
				}
			}
        	
			for (int i = begin; i < sum; i++) {
				if (searchHits[i] != null) {
					JSONObject jsonObject = JSONObject.parseObject(searchHits[i].getSourceAsString());
					ZtxmOaFwSq ztxmOaFwSq = JSONObject.toJavaObject(jsonObject, ZtxmOaFwSq.class);

					SearchHit hit = searchHits[i];
					//logger.info("indexHit:" + hit.getIndex() + "  typeHit:" + hit.getType() + "  id:" + hit.getId() + " score" + hit.getScore());

					// 搜索内容 -- 高亮
					String content = "";
					Map<String, HighlightField> highlightFields = hit.getHighlightFields();
					if (keySet != null && keySet.size() > 0) {
						for(String key : keySet){
							HighlightField highlight = highlightFields.get(key);
							
							if (highlight != null) {
								Text[] fragments = highlight.fragments(); // 多值的字段会有多个值
								if (fragments != null) {
									for (int j = 0; j < fragments.length; j++) {
										String fragmentString = fragments[j].string();
										if (fragmentString != null) {
											/*if (fragmentString.toString().length() > 50) {
												content += fragmentString.toString().substring(0, 50) + "......";
											} else {*/
												content += fragmentString.toString();
											/*}*/
										}
										content += "; ";
									}
								}
							}
						}
						
						if (content != null) {
							content.replace("\t", "");
							content.replace("\n", "");
							content.replace("\r", "");
						}
						//logger.info(content);
						ztxmOaFwSq.setBak1(content);
					}

					ztxmOaFwSqList.add(ztxmOaFwSq);
				}
			}
		}
		
		map.put("rows", ztxmOaFwSqList);
		map.put("total", total);
		
		return map;
	}

到了这里,关于Java查询es数据,根据指定id检索(in查询),sql权限过滤,多字段匹配检索,数据排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java根据id对elasticsearch查询操作

    一、根据一个id查询 二、根据多个ids查询

    2024年02月12日
    浏览(46)
  • ES es Elasticsearch 十三 Java api 实现搜索 分页查询 复杂查询 过滤查询 ids查询 等

    目录 Java api 实现搜索 Pom.xml 建立链接 搜索全部记录 增加规则值查某些字段 搜索分页 全代码 Ids 搜索 搜索Match搜索 multi_match 搜索 多字段搜索 复杂查询 bool查询 filter  bool 复杂查询增加过滤器查询 复杂擦好像加排序 日志 思路 参考 api 写法 写Java代码 请求条件构建层次

    2024年02月04日
    浏览(50)
  • ES根据日期查询数据

    1 实体类写入ES 在写入ES库的时候,日期格式需要转换成ES可以识别的日期格式: 然后写入ES库即可 一般是根据时间区间查询,所以如果有空字段可以设置一个默认值方便查询  2 查询ES数据的时候 ES的一些搜索规则: 参考: JAVA代码实现ElasticSearch搜索(入门-进阶)(一):搜索方

    2024年02月11日
    浏览(43)
  • 交友项目【根据id查询单条动态&发布评论&查询评论列表】

    目录 1:根据id查询单条动态 1.1:接口分析 1.2:流程分析 1.3:代码实现 2:发布评论 2.1:接口分析 2.2:流程分析 2.3:代码实现 3:查询评论列表 3.1:接口分析 3.2:流程分析 3.3:代码实现 1.1:接口分析 API 接口文档: http://192.168.136.160:3000/project/19/interface/api/151 注意: 单条动

    2023年04月23日
    浏览(44)
  • 【MySQL】根据多个字段查询数据进行去重的sql编写

    一、实现思路 根据四个字段进行数据去重的SQL编写可以使用GROUP BY和HAVING子句来实现。 场景一: 假设有一个名为 table1 的数据表,其中包含四个字段: field1 、 field2 、 field3 和 field4 。要求根据这四个字段进行数据去重。 可以使用以下SQL语句: 场景二: 上述SQL语句会返回所

    2024年02月15日
    浏览(44)
  • es elasticsearch kibana 根据 id 只更新部分字段

    官方文档: https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html#_update_part_of_a_document 给自己记录一下: 其中 test 是索引名,需要根据实际情况替换。_update 是固定值,表示更新文档。1 是想要更新文档的主键,根据实际情况替换。 “doc” 是固定值,“my_field_name” 是被

    2024年02月13日
    浏览(38)
  • MySQL根据父节点id查询所有子节点信息

    替换内容: table_demo 替换成对应表名 pid 替换成父id的命名 id 替换成关联id的命名 state 数据状态(自定义条件,比如:数据是否可用) code 替换成要查询的 入参id值 示例: 注: 如出现 mysql中的“非法混合排序规则”错误,查看字符集和排序规则,或者添加 COLLATE utf8mb4_gener

    2024年02月03日
    浏览(58)
  • Error querying database. Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘u.user_id‘ in ‘whe

    记录一下, 如下报错 提示:这里填写问题的分析: 在确保sql语法正确的情况下 其中left join sys_user su on tmu.receive_user_id=su.user_id 这里的 sys_user su 这个别名su 要与 userAlias = \\\"su\\\" 的su相对应,名不能乱起 其中datascrop.java

    2024年02月07日
    浏览(37)
  • docker 查询指定名字的容器id

    1.要查询指定名字的Docker容器ID,可以使用以下命令: 2.其中, CONTAINER_NAME 是要查询的容器名称。 3.该命令将返回指定名称的容器ID。请注意,如果存在多个具有相同名称的容器,则该命令将返回所有这些容器的ID。 4.解释一下命令的各个选项: ps :列出正在运行的容器。 -

    2024年02月11日
    浏览(33)
  • Elasticsearch实战(十七)---ES搜索如何使用In操作查询及如何Distinct去除重复数据

    Elasticsearch实战-ES搜索如何使用In操作查询filter过滤及如何Distinct去除重复数据 场景: ES搜索, 获取手机号是 19000001111 或者 19000003333 后者 19000004444 的人, 并且 性别是男, 且 年龄是[20-30]的人,这种查询用mysql 如何实现 ? 在mysql中会用in查询, 但是在ES中 我们实现就是 term

    2023年04月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包