ES--term&terms查詢
阿新 • • 發佈:2021-07-05
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);
}
}