欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

2.將當(dāng)前用戶可查詢的數(shù)據(jù)id集合idsList通過(guò)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.通過(guò)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信息:通過(guò)sql過(guò)濾出當(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集合通過(guò)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;
        	//分頁(yè)信息
        	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來(lái)執(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é)果集的分頁(yè)信息。最后,我們通過(guò)RestHighLevelClient對(duì)象執(zhí)行查詢請(qǐng)求,并返回查詢結(jié)果。

總結(jié) 

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

相關(guān)文章

  • Spring使用AspectJ注解和XML配置實(shí)現(xiàn)AOP

    Spring使用AspectJ注解和XML配置實(shí)現(xiàn)AOP

    這篇文章主要介紹了Spring使用AspectJ注解和XML配置實(shí)現(xiàn)AOP的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Java微服務(wù)之Feign遠(yuǎn)程調(diào)用方式

    Java微服務(wù)之Feign遠(yuǎn)程調(diào)用方式

    這篇文章主要介紹了Java微服務(wù)之Feign遠(yuǎn)程調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • SpringBoot項(xiàng)目沒(méi)有把依賴的jar包一起打包的問(wèn)題解決

    SpringBoot項(xiàng)目沒(méi)有把依賴的jar包一起打包的問(wèn)題解決

    這篇文章主要介紹了SpringBoot項(xiàng)目沒(méi)有把依賴的jar包一起打包的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java中將String類型依照某個(gè)字符分割成數(shù)組的方法

    Java中將String類型依照某個(gè)字符分割成數(shù)組的方法

    下面小編就為大家分享一篇Java中將String類型依照某個(gè)字符分割成數(shù)組的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • Java調(diào)用接口如何獲取json數(shù)據(jù)解析后保存到數(shù)據(jù)庫(kù)

    Java調(diào)用接口如何獲取json數(shù)據(jù)解析后保存到數(shù)據(jù)庫(kù)

    這篇文章主要介紹了Java調(diào)用接口如何獲取json數(shù)據(jù)解析后保存到數(shù)據(jù)庫(kù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Centos 7 安裝 OpenJDK 11 兩種方式及問(wèn)題小結(jié)

    Centos 7 安裝 OpenJDK 11 兩種方式及問(wèn)題小結(jié)

    這篇文章主要介紹了Centos 7 安裝 OpenJDK 11 兩種方式,第一種方式使用yum安裝,第二種方式使用tar解壓安裝,每種方法給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • Jenkins遷移job插件Job Import Plugin流程詳解

    Jenkins遷移job插件Job Import Plugin流程詳解

    這篇文章主要介紹了Jenkins遷移job插件Job Import Plugin流程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 簡(jiǎn)單了解java函數(shù)式編碼結(jié)構(gòu)及優(yōu)勢(shì)

    簡(jiǎn)單了解java函數(shù)式編碼結(jié)構(gòu)及優(yōu)勢(shì)

    這篇文章主要介紹了簡(jiǎn)單了解java函數(shù)式編碼結(jié)構(gòu)及優(yōu)勢(shì),本文將探討三種下一代 JVM 語(yǔ)言:Groovy、Scala 和 Clojure,比較并對(duì)比新的功能和范例,讓 Java 開(kāi)發(fā)人員對(duì)自己近期的未來(lái)發(fā)展有大體的認(rèn)識(shí)。,需要的朋友可以參考下
    2019-06-06
  • Java遞歸實(shí)現(xiàn)評(píng)論多級(jí)回復(fù)功能

    Java遞歸實(shí)現(xiàn)評(píng)論多級(jí)回復(fù)功能

    這篇文章主要介紹了Java遞歸實(shí)現(xiàn)評(píng)論多級(jí)回復(fù)功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • java中JSqlParser的使用

    java中JSqlParser的使用

    JSqlParse是一款很精簡(jiǎn)的sql解析工具,它可以將常用的sql文本解析成具有層級(jí)結(jié)構(gòu)的語(yǔ)法樹(shù),本文主要介紹了java中JSqlParser的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07

最新評(píng)論