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);
}
}