其實之前關於ElasticSearch的一些書,感覺對於查詢是有點懵逼的,一會查詢,一會過濾查詢。而且有的語法在6.x的版本上已經廢棄了。所以看起來更加困惑了。五一這兩天又靜下心來看了一些,感覺像我平時的一些基本使用,用bool查詢都可以滿足,而且當你理解了bool查詢之後,用java來調用es也會比較得心應手。
一、kibana es 查詢:如下例子都是以6.x的版本
bool查詢如下:
GET /cartoonindex/_search/
{
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "人 忍者",
"fields": ["name","introduction"],
"operator": "or"
}
},
{
"range": {
"time": {
"gte": "2009-09-30",
"lte": "2010-09-30"
}
}
}
]
}
}
}
如上是我本地es的一個bool查詢,boot查詢主要包括三個部分,must,should,must_not,分別對應類似數據庫查詢and,or,"非"
比如在must中,又是一箇中括號,類似於數組,表示裏面又可以寫多個查詢條件。
如上截圖中的查詢,查詢條件就是查詢name和introduction字段中,包含“人”或者“忍者”的記錄,且時間是在"2009-09-30"和“2010-09-30”
二、java接口實現如上調用:
其實搞清楚瞭如上的es查詢語句,再用java去調用也會比較有的放矢。
如下代碼主要包括兩個部分:
1、構建查詢語句
2、執行查詢
@ResponseBody
@RequestMapping("/searchCartonBool")
public List<Carton> searchCartonBool(String keyWord){
BoolQueryBuilder catronBoolquery = QueryBuilders.boolQuery();
if (!StringUtils.isEmpty(keyWord)) {
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keyWord, new String[]{"name", "introduction"});
multiMatchQueryBuilder.operator(Operator.OR);//默認是"or",如果修改成"and",則表示記錄中要同時包含條件
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("time");
rangeQueryBuilder.gte("2009-09-30");
rangeQueryBuilder.lte("2010-09-30");
catronBoolquery.must(multiMatchQueryBuilder);//將第一個條件插入到must
catronBoolquery.must(rangeQueryBuilder);//將第二個根據時間篩選的條件插入到must
}
System.out.println(catronBoolquery);//打印查詢語句
SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(catronBoolquery).build();//執行查詢
List<Carton> cartons = elasticsearchTemplate.queryForList(searchQuery, Carton.class);
System.out.println(cartons);
return cartons;
}
postman返回結果:
搞清楚這個bool查詢,再看這個java調用的代碼感覺就清晰多了,而且查詢再變化,也大概瞭解要調用哪些方法。
如上只是我這個初學者的有些理解,如有問題還請各位指出,謝謝