Java查詢Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢)、sql權(quán)限過濾、多字段匹配檢索及數(shù)據(jù)排序
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è)置請求和響應(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對象
Map<String, Map<String, Map<String, String>>> dataDicGroupToItemMap = AmcInterface.getDataDicGroupToItemMap();
if (dataDicGroupToItemMap != null) {
// 獲得字典組代碼對應(yīng)的全部字典項(xiàng)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();
//獲取符合當(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);
//將請求體加入到請求中
searchRequest.source(sourceBuilder);
//發(fā)送請求
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(); // 多值的字段會有多個(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對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對象,并指定要查詢的索引名稱(“my_index”)。然后,我們創(chuàng)建了一個(gè)SearchSourceBuilder對象,并設(shè)置了查詢條件、排序方式以及結(jié)果集的分頁信息。最后,我們通過RestHighLevelClient對象執(zhí)行查詢請求,并返回查詢結(jié)果。
總結(jié)
到此這篇關(guān)于Java查詢Elasticsearch數(shù)據(jù)根據(jù)指定id檢索(in查詢)、sql權(quán)限過濾、多字段匹配檢索及數(shù)據(jù)排序的文章就介紹到這了,更多相關(guān)Java集成es數(shù)據(jù)查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java使用ES?Client?調(diào)用滾動查詢及Elasticsearch滾動查詢Scrolling機(jī)制
- Java?Api實(shí)現(xiàn)Elasticsearch的滾動查詢功能
- Java利用ElasticSearch實(shí)現(xiàn)自動補(bǔ)全功能
- Java+ElasticSearch+Pytorch實(shí)現(xiàn)以圖搜圖功能
- Java中Elasticsearch 實(shí)現(xiàn)分頁方式(三種方式)
- 關(guān)于Java中配置ElasticSearch集群環(huán)境賬號密碼的問題
- Java如何使用elasticsearch進(jìn)行模糊查詢
- JAVA使用ElasticSearch查詢in和not in的實(shí)現(xiàn)方式
- JAVA操作elastic?search的詳細(xì)過程
相關(guā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配置文件未生效的原因分析與解決方法
在日常開發(fā) Spring Boot 項(xiàng)目的時(shí)候,大家應(yīng)該都遇到過這樣一種情況:明明寫了 application.yml,但是項(xiàng)目跑起來之后,配置好像完全沒被加載,下面我們就來聊聊Spring Boot 配置文件未生效 的幾個(gè)典型場景與解決方法吧2025-09-09
Java 進(jìn)程執(zhí)行外部程序造成阻塞的一種原因
前一陣子在研究文檔展示時(shí)使用了java進(jìn)程直接調(diào)用外部程序,其中遇到一個(gè)問題花了好長時(shí)間才解決,這個(gè)問題就是外部程序直接執(zhí)行沒什么問題,但是當(dāng)使用Java進(jìn)程執(zhí)行時(shí)外部程序就阻塞在那兒不動了。而且這個(gè)外部程序在處理某些文件時(shí)使用Java進(jìn)程執(zhí)行是沒問題的2014-03-03
Spring?@Transactional?注解從入門到避坑指南
文章主要講解了Spring的@Transactional注解的使用場景、核心屬性詳解、事務(wù)傳播行為、隔離級別、回滾配置、底層原理以及失效場景和避免之道,并還給出了最佳實(shí)踐,感興趣的朋友跟隨小編一起看看吧2026-05-05

