Java查詢Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢)、sql權(quán)限過(guò)濾、多字段匹配檢索及數(shù)據(jù)排序
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)文章希望大家以后多多支持腳本之家!
- Java使用ES?Client?調(diào)用滾動(dòng)查詢及Elasticsearch滾動(dòng)查詢Scrolling機(jī)制
- Java?Api實(shí)現(xiàn)Elasticsearch的滾動(dòng)查詢功能
- Java利用ElasticSearch實(shí)現(xiàn)自動(dòng)補(bǔ)全功能
- Java+ElasticSearch+Pytorch實(shí)現(xiàn)以圖搜圖功能
- Java中Elasticsearch 實(shí)現(xiàn)分頁(yè)方式(三種方式)
- 關(guān)于Java中配置ElasticSearch集群環(huán)境賬號(hào)密碼的問(wèn)題
- Java如何使用elasticsearch進(jìn)行模糊查詢
- JAVA使用ElasticSearch查詢in和not in的實(shí)現(xiàn)方式
- JAVA操作elastic?search的詳細(xì)過(guò)程
相關(guān)文章
Spring使用AspectJ注解和XML配置實(shí)現(xiàn)AOP
這篇文章主要介紹了Spring使用AspectJ注解和XML配置實(shí)現(xiàn)AOP的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10Java微服務(wù)之Feign遠(yuǎn)程調(diào)用方式
這篇文章主要介紹了Java微服務(wù)之Feign遠(yuǎn)程調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05SpringBoot項(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-09Java中將String類型依照某個(gè)字符分割成數(shù)組的方法
下面小編就為大家分享一篇Java中將String類型依照某個(gè)字符分割成數(shù)組的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03Java調(diào)用接口如何獲取json數(shù)據(jù)解析后保存到數(shù)據(jù)庫(kù)
這篇文章主要介紹了Java調(diào)用接口如何獲取json數(shù)據(jù)解析后保存到數(shù)據(jù)庫(kù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03Centos 7 安裝 OpenJDK 11 兩種方式及問(wèn)題小結(jié)
這篇文章主要介紹了Centos 7 安裝 OpenJDK 11 兩種方式,第一種方式使用yum安裝,第二種方式使用tar解壓安裝,每種方法給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09Jenkins遷移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ì),本文將探討三種下一代 JVM 語(yǔ)言:Groovy、Scala 和 Clojure,比較并對(duì)比新的功能和范例,讓 Java 開(kāi)發(fā)人員對(duì)自己近期的未來(lái)發(fā)展有大體的認(rèn)識(shí)。,需要的朋友可以參考下2019-06-06Java遞歸實(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