我將學生資訊放在彈性搜索資料庫中。我正在嘗試執行搜索
獲取學生成績為“A”的所有記錄
{ "query":{ "bool":{ "must":[ { "match":{ "grade":{ "query":"A", "operator":"OR", "prefix_length":0, "max_expansions":50, "fuzzy_transpositions":true, "lenient":false, "zero_terms_query":"NONE", "auto_generate_synonyms_phrase_query":true, "boost":1.0 } } } ], "adjust_pure_negative":true, "boost":1.0 } } }獲取城市值以 B* 開頭的所有記錄
{ "query":{ "bool":{ "must":[ { "regexp":{ "city":{ "value":"B*", "flags_value":65535, "max_determinized_states":10000, "boost":1.0 } } } ], "adjust_pure_negative":true, "boost":1.0 } } }用于生成搜索查詢
SearchSourceBuilder elasticSearchSourceBuilder = new SearchSourceBuilder(); BoolQueryBuilder esQueryBuilder = QueryBuilders.boolQuery(); Map<String,List<String>> searchCriteriaMap = new HashMap(); searchCriteriaMap.put("grade", Arrays.asList(new String[] {"A"})); for(Map.Entry<String, List<String>> entry :searchCriteriaMap.entrySet()) { List<String> parameterValueList = searchCriteriaMap.get(entry.getKey()); String parameterValue = String.join(",", parameterValueList); MatchQueryBuilder matchQueryBuilder= QueryBuilders.matchQuery(entry.getKey(), parameterValue); esQueryBuilder.must(matchQueryBuilder); }對于生成正則運算式查詢:
SearchSourceBuilder elasticSearchSourceBuilder = new SearchSourceBuilder(); BoolQueryBuilder esQueryBuilder = QueryBuilders.boolQuery(); Map<String,List<String>> searchCriteriaMap = new HashMap(); searchCriteriaMap.put("city", Arrays.asList(new String[] {"Bangalore*"})); //queryParameterMap1.put("school.name", Arrays.asList(new String[] {"Joseph"})); for(Map.Entry<String, List<String>> entry :searchCriteriaMap.entrySet()) { RegexpQueryBuilder matchQueryBuilder= QueryBuilders.regexpQuery("city", "Bang*"); esQueryBuilder.must(matchQueryBuilder); }
如何在單個查詢中處理這兩個條件,即成績為 A 且城市值應以 B* 開頭的學生。為了生成查詢,我使用了 Java Elastic search query Builder。
學生記錄如下:
{
"name":"Anthon",
"id":"JO-01",
"courses":[
"English",
"Science",
"Mathematics",
"Physics",
"Biology"
],
"grade":"A",
"cgpa":8.3,
"schoolName":"Joseph Higher Seconday School",
"city":"Bangalore",
"dateOfJoining":"Jul 24, 3914 12:00:00 AM"
}
uj5u.com熱心網友回復:
您可以將兩個查詢的 must 子句組合起來
詢問:
{
"query": {
"bool": {
"must": [
{
"match": {
"grade": {
"query": "A"
}
}
},
{
"regexp": {
"city.keyword": {
"value": "B.*"
}
}
}
]
}
}
}
Java 代碼:
SearchSourceBuilder elasticSearchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder esQueryBuilder = QueryBuilders.boolQuery();
MatchQueryBuilder matchQueryBuilder= QueryBuilders.matchQuery("grade", "A");
RegexpQueryBuilder regxQueryBuilder= QueryBuilders.regexpQuery("city", "B*");
esQueryBuilder.must(matchQueryBuilder);
esQueryBuilder.must(regxQueryBuilder);
System.out.println(esQueryBuilder.toString());
在這里,如果您使用的是多欄位,那么您需要給出city.keyword并且您需要傳遞與欄位值相同的查詢B.*,如果您將城市欄位定義為文本,那么您需要將city欄位名稱和值用作b.*
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/444289.html
上一篇:Elasticsearch過濾器以獲取給定欄位的每個值的最后一個檔案
下一篇:修改通過標準分詞器生成的令牌
