1. 程式人生 > 其它 >ES--term&terms查詢

ES--term&terms查詢

2.1、term&terms查詢

2.1.1、term查詢

  參考: Elasticsearch Reference [7.10] » Query DSL » Term-level queries » Term query
  term的查詢是代表完全匹配,搜尋之前不會對你搜索的關鍵字進行分詞,如關鍵字手機,不會分成手和機;再根據關鍵字去文件分詞庫中去匹配內容。
類似於MySQL庫的 where province = ?

2.1.1.1、命令

# from size類似於mysql的limit
POST /sms-logs-index/_search
{
  "from": 0,
  "size": 10, 
  "query": {
    "term": {
      "province": {
        "value": "北京"
      }
    }
  }
}

2.1.1.2、java程式碼

    @Test
    public void termQuery() throws IOException {
        //1。建立request物件,查詢用的物件一般都是SearchRequest物件
        SearchRequest mySearchRequest = new SearchRequest(index);

        //2,指定查詢條件,依賴查詢條件的物件SearchSourceBuilder的物件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.from(0).size(10).query(QueryBuilders.termQuery("province", "北京")); //指定term查新條件

        mySearchRequest.source(builder);
        //3. 執行查詢
        SearchResponse search = client.search(mySearchRequest, RequestOptions.DEFAULT);

        //4. 獲取到_source中的資料,並展示
        //注意RESTFUL風格上是兩個hits,所以這裡要兩次getHits()
        for (SearchHit hit : search.getHits().getHits()) {
            Map<String, Object> result = hit.getSourceAsMap();
            System.out.println(result);
        }
    }

2.1.2、terms 查詢

terms和terms的查詢機制是一樣的,都不會將指定的查詢關鍵字進行分詞,直接去分詞庫中匹配,找到相應的文件內容。
terms:是針對一個欄位包含多個值時使用。
換句話說:

  • term類似於MySQL的 where province=?
  • terms類似於MySQL中的 where province in (?, ? ,?)

   注意:term和terms只是說不會對關鍵字進行分詞,並不是說只能用於keyword型別的欄位查詢,如假設文件中有個欄位是text型別,採用了ik分詞器,裡面的值是奮鬥的時代,通過網上線上ik分詞器,我們知道會分解成奮鬥,奮,鬥,時代,如圖4,但是如果你用該欄位的term或者terms查詢,輸入的關鍵字是奮鬥的時代,因為輸入的關鍵字不會分詞,反而查不到該記錄,如果你輸入的關鍵字是奮鬥就是可以的。

2.1.2.1、命令

POST /sms-logs-index/_search
{
  "from": 0,
  "size": 20,
  "query": {
    "terms": {
      "province": [
        "北京",
        "上海",
        "杭州"
      ]
    }
  }
}

2.1.2.2、java程式碼

    @Test
    public void termsQuery() throws IOException {
        //1。建立request物件,查詢用的物件一般都是SearchRequest物件
        SearchRequest mySearchRequest = new SearchRequest(index);

        //2,指定查詢條件,依賴查詢條件的物件SearchSourceBuilder的物件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.from(0).size(10).query(QueryBuilders.termsQuery("province", "北京", "上海", "杭州")); //指定term查新條件
		
		// 注意將條件放入Request物件中
        mySearchRequest.source(builder);
        
        //3. 執行查詢
        SearchResponse search = client.search(mySearchRequest, RequestOptions.DEFAULT);

        //4. 獲取到_source中的資料,並展示
        //注意RESTFUL風格上是兩個hits,所以這裡要兩次getHits()
        for (SearchHit hit : search.getHits().getHits()) {
            Map<String, Object> result = hit.getSourceAsMap();
            System.out.println(result);
        }
    }