最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java查詢Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢)、sql權(quán)限過濾、多字段匹配檢索及數(shù)據(jù)排序

 更新時(shí)間:2024年05月21日 09:24:58   作者:cjewioivsxoewll  
在Java開發(fā)中Elasticsearch(簡(jiǎn)稱ES)是一個(gè)非常流行的搜索引擎,它提供了強(qiáng)大的全文搜索和分析功能,這篇文章主要給大家介紹了關(guān)于Java查詢Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢)、sql權(quán)限過濾、多字段匹配檢索及數(shù)據(jù)排序的相關(guān)資料,需要的朋友可以參考下

Java集成Elasticsearch數(shù)據(jù)查詢

Java集成Elasticsearch,進(jìn)行索引數(shù)據(jù)查詢,并進(jìn)行sql權(quán)限過濾,指定id檢索(in查詢),多字段匹配檢索,數(shù)據(jù)排序。由于權(quán)限過濾是根據(jù)sql語句判斷當(dāng)前用戶或其部門可查詢的數(shù)據(jù),所以采用以下方法:

1.通過sql過濾出當(dāng)前用戶可查詢的數(shù)據(jù)id集合idsList;

2.將當(dāng)前用戶可查詢的數(shù)據(jù)id集合idsList通過QueryBuilders.idsQuery()進(jìn)行查詢,類似Mysql的in (’ ‘,’ ‘,’ ')查詢。

Java代碼

1.action代碼

	public void sq_list(){
		//獲取數(shù)據(jù)
		PrintWriter writer = null;
		//建立連接
		RestHighLevelClient restHighLevelClient = RestHighLevelClientFactory.getHighLevelClient();
		try {
			writer = this.getResponse().getWriter();
			//設(shè)置請(qǐng)求和響應(yīng)相關(guān)參數(shù)
			ResponseUtil.setResponseParam(this.getResponse(), this.getRequest());
			//接收參數(shù)
			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 {
			//關(guān)閉連接
            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()進(jìn)行類似Mysql的in (’ ‘,’ ‘,’ ')查詢

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.idsQuery().addIds(idsList.toArray(new String[]{})));
sourceBuilder.query(boolQueryBuilder);

2.索引多字段匹配數(shù)據(jù)查詢

boolQueryBuilder.must(QueryBuilders.multiMatchQuery(esSearch, keySetArray).slop(0).type(“phrase”));

3.排序構(gòu)建器:按照索引指定字段進(jìn)行倒序排序

FieldSortBuilder sortBuilder = SortBuilders.fieldSort(“sqTjsj”).order(SortOrder.DESC);
sourceBuilder.sort(sortBuilder);
	/**
	 * 全文檢索
	 */
	@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對(duì)象
		Map<String, Map<String, Map<String, String>>> dataDicGroupToItemMap = AmcInterface.getDataDicGroupToItemMap();
		if (dataDicGroupToItemMap != null) {
			// 獲得字典組代碼對(duì)應(yīng)的全部字典項(xiàng)map對(duì)象
			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();

		//獲取符合當(dāng)前用戶權(quán)限的發(fā)文id信息:通過sql過濾出當(dāng)前用戶可查詢的數(shù)據(jù)id集合
		List<String> idsList = getFwSqListIds(paramMap);
		logger.info("列表查詢:符合用戶權(quán)限的id數(shù)量: "+idsList.size());
		
		//查詢參數(shù)設(shè)置
		BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
		//將當(dāng)前用戶可查詢的數(shù)據(jù)id集合通過QueryBuilders.idsQuery()進(jìn)行in查詢
		if (idsList != null && idsList.size() > 0) {		
			boolQueryBuilder.must(QueryBuilders.idsQuery().addIds(idsList.toArray(new String[]{})));
		}
		//索引多字段匹配數(shù)據(jù)查詢
		if (keySetArray != null && keySetArray.length > 0) {
			boolQueryBuilder.must(QueryBuilders.multiMatchQuery(esSearch, keySetArray).slop(0).type("phrase"));		
		}
		sourceBuilder.query(boolQueryBuilder);
        
        //排序構(gòu)建器設(shè)置:按照索引數(shù)據(jù)的提交時(shí)間倒序排序
        FieldSortBuilder sortBuilder = SortBuilders.fieldSort("sqTjsj").order(SortOrder.DESC);
        sourceBuilder.sort(sortBuilder);
        
        //基礎(chǔ)參數(shù)設(shè)置
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        sourceBuilder.size(5000);//默認(rèn)查詢10條數(shù)據(jù)
        
        //設(shè)置高亮顯示
        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);
        
        //將請(qǐng)求體加入到請(qǐng)求中
        searchRequest.source(sourceBuilder);

        //發(fā)送請(qǐng)求
        SearchResponse searchResponse = rhclient.search(searchRequest, RequestOptions.DEFAULT);

        //處理搜索命中文檔結(jié)果
        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) {
        	//總條數(shù)
        	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());

					// 搜索內(nèi)容 -- 高亮
					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(); // 多值的字段會(huì)有多個(gè)值
								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;
	}

附:復(fù)雜查詢示例

一旦我們建立了與Elasticsearch集群的連接,就可以使用Java來執(zhí)行復(fù)雜的查詢操作了。以下是一個(gè)示例,展示如何使用Java對(duì)ES中的數(shù)據(jù)進(jìn)行查詢:

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.client.RequestOptions;

public class ElasticsearchQuery {
    private ElasticsearchClient elasticsearchClient;

    public ElasticsearchQuery() {
        elasticsearchClient = new ElasticsearchClient();
    }

    public SearchResponse executeQuery() throws IOException {
        RestHighLevelClient client = elasticsearchClient.getClient();

        SearchRequest searchRequest = new SearchRequest("my_index");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        searchSourceBuilder.query(QueryBuilders.matchQuery("title", "java"))
            .sort(SortBuilders.fieldSort("date").order(SortOrder.DESC))
            .from(0).size(10);

        searchRequest.source(searchSourceBuilder);

        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

        return searchResponse;
    }
}

在以上示例中,我們首先創(chuàng)建了一個(gè)SearchRequest對(duì)象,并指定要查詢的索引名稱(“my_index”)。然后,我們創(chuàng)建了一個(gè)SearchSourceBuilder對(duì)象,并設(shè)置了查詢條件、排序方式以及結(jié)果集的分頁信息。最后,我們通過RestHighLevelClient對(duì)象執(zhí)行查詢請(qǐng)求,并返回查詢結(jié)果。

總結(jié) 

到此這篇關(guān)于Java查詢Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢)、sql權(quán)限過濾、多字段匹配檢索及數(shù)據(jù)排序的文章就介紹到這了,更多相關(guān)Java集成es數(shù)據(jù)查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java取某段/某個(gè)時(shí)間段的值的方法

    java取某段/某個(gè)時(shí)間段的值的方法

    這篇文章主要介紹了java取某段/某個(gè)時(shí)間段的值的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Spring?Security實(shí)現(xiàn)統(tǒng)一登錄與權(quán)限控制的示例代碼

    Spring?Security實(shí)現(xiàn)統(tǒng)一登錄與權(quán)限控制的示例代碼

    這篇文章主要介紹了Spring?Security實(shí)現(xiàn)統(tǒng)一登錄與權(quán)限控制,本文通過示例代碼重點(diǎn)看一下統(tǒng)一認(rèn)證中心和業(yè)務(wù)網(wǎng)關(guān)的建設(shè),需要的朋友可以參考下
    2022-03-03
  • 項(xiàng)目中SpringBoot配置文件未生效的原因分析與解決方法

    項(xiàng)目中SpringBoot配置文件未生效的原因分析與解決方法

    在日常開發(fā) Spring Boot 項(xiàng)目的時(shí)候,大家應(yīng)該都遇到過這樣一種情況:明明寫了 application.yml,但是項(xiàng)目跑起來之后,配置好像完全沒被加載,下面我們就來聊聊Spring Boot 配置文件未生效 的幾個(gè)典型場(chǎng)景與解決方法吧
    2025-09-09
  • Spring中的循環(huán)依賴問題

    Spring中的循環(huán)依賴問題

    在Spring框架中,循環(huán)依賴是指兩個(gè)或多個(gè)Bean相互依賴,這導(dǎo)致在Bean的創(chuàng)建過程中出現(xiàn)依賴死鎖,為了解決這一問題,Spring引入了三級(jí)緩存機(jī)制,包括singletonObjects、earlySingletonObjects和singletonFactories
    2024-09-09
  • Java?SWT中常見彈出框?qū)嵗偨Y(jié)

    Java?SWT中常見彈出框?qū)嵗偨Y(jié)

    剛開始寫Java工具的小伙伴可能不知道怎么寫消息對(duì)話框,在這里總結(jié)一些常用的幾種消息彈出框,下面這篇文章主要給大家介紹了關(guān)于Java?SWT中常見彈出框的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 詳解Java9新特性中的模塊化與反射機(jī)制

    詳解Java9新特性中的模塊化與反射機(jī)制

    Java9中的一個(gè)重大變化就是引入了模塊化系統(tǒng),這個(gè)系統(tǒng)使得Java應(yīng)用程序的構(gòu)建、發(fā)布和部署更加具有可控性和可重用性,與此同時(shí),Java9還改進(jìn)了反射機(jī)制,讓它與模塊化系統(tǒng)更好地配合,本文通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Java 進(jìn)程執(zhí)行外部程序造成阻塞的一種原因

    Java 進(jìn)程執(zhí)行外部程序造成阻塞的一種原因

    前一陣子在研究文檔展示時(shí)使用了java進(jìn)程直接調(diào)用外部程序,其中遇到一個(gè)問題花了好長(zhǎng)時(shí)間才解決,這個(gè)問題就是外部程序直接執(zhí)行沒什么問題,但是當(dāng)使用Java進(jìn)程執(zhí)行時(shí)外部程序就阻塞在那兒不動(dòng)了。而且這個(gè)外部程序在處理某些文件時(shí)使用Java進(jìn)程執(zhí)行是沒問題的
    2014-03-03
  • java中的按位與(&)用法說明

    java中的按位與(&)用法說明

    這篇文章主要介紹了java中的按位與(&)用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Spring?@Transactional?注解從入門到避坑指南

    Spring?@Transactional?注解從入門到避坑指南

    文章主要講解了Spring的@Transactional注解的使用場(chǎng)景、核心屬性詳解、事務(wù)傳播行為、隔離級(jí)別、回滾配置、底層原理以及失效場(chǎng)景和避免之道,并還給出了最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧
    2026-05-05
  • java -jar 運(yùn)行及日志輸出過程

    java -jar 運(yùn)行及日志輸出過程

    這篇文章主要介紹了java -jar 運(yùn)行及日志輸出過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06

最新評(píng)論

乡城县| 萍乡市| 崇仁县| 旅游| 常德市| 利辛县| 泰顺县| 普陀区| 涿鹿县| 蓝山县| 綦江县| 敦化市| 枝江市| 涟源市| 澳门| 海晏县| 军事| 清水县| 崇文区| 青神县| 灵台县| 林口县| 蓝田县| 蓝田县| 竹山县| 屯门区| 丰原市| 曲松县| 东阿县| 肇州县| 赣州市| 宁明县| 治县。| 营山县| 大渡口区| 永寿县| 京山县| 宜宾县| 马鞍山市| 错那县| 沭阳县|