ElasticSearch查詢之bool查詢及java調用bool查詢demo

其實之前關於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調用的代碼感覺就清晰多了,而且查詢再變化,也大概瞭解要調用哪些方法。

如上只是我這個初學者的有些理解,如有問題還請各位指出,謝謝

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章