查詢條件
主要包含了以下幾個
- match_all
- match
- term
- range
match
match類型查詢,會把查詢條件進行分詞,然后再查詢,詞條之間是or關系,按照相關性得分排序。
GET /lind/_search
{
"query": {
"match":{
"name": "hello world"
}
}
}
改成and,並且的關系
GET /lind/_search
{
"query":{
"match":{
"title":{
"query":"中國生活",
"operator":"and"
}
}
}
}
minimum_should_match參數:match支持使用minimum_should_match 最小匹配參數,通常設置為一個百分數.
用戶給定的條件分詞后,有3個詞,但是其中的2個是在描述他想要搜索的內容,那我們使用minimum_should_match就是最好的選擇!
GET /lind/_search
{
"query":{
"match":{
"title":{
"query":"中國人",
"minimum_should_match":"75%"
}
}
}
}
多字段查詢 muti_match
muti_match和match一樣,但是不同的是它可以同時在多個字段中檢索
GET /lind/_search
{
"query":{
"multi_match":{
"query":"國產",
"fields":["title","name"]
}
}
詞條查詢term
它被用作精確查詢,比如數字,時間,布爾,和字段屬性為keyword類型的關鍵字,后面講的聚合也只支持精確字段,而分詞字段text是不被支持
的。
GET /lind/_search
{
"query": {
"term": {
"sex": {
"value": "中國"
}
}
}
}
聚合
聚合操作,我們可以對數據進行分組的求和,求數,最大值,最小值,或者其它的自定義的統計功能,es對聚合有着不錯的支持,需要注意的是,在對某字段進行聚合之后,需要開啟這個字段的fielddata我,或者會出現如下錯誤:
Fielddata is disabled on text fields by default.
通過postman等工作像es api發送請求,可以將字段的這個特性打開.
PUT /esdto/esdto/_mapping
{
"properties": {
"sex": {
"type": "text",
"fielddata": true
}
}
}
使用ElasticsearchTemplate對sex字段進行聚合
// 創建一個查詢條件對象
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
// 拼接查詢條件
queryBuilder.should(QueryBuilders.termQuery("creator", "1"));
// 創建聚合查詢條件
TermsAggregationBuilder agg = AggregationBuilders.terms("sex").field("sex.keyword");//keyword表示不使用分詞進行聚合
// 創建查詢對象
SearchQuery build = new NativeSearchQueryBuilder()
.withQuery(queryBuilder) //添加查詢條件
.addAggregation(agg) // 添加聚合條件
.withPageable(PageRequest.of(0, 10)) //符合查詢條件的文檔分頁(不是聚合的分頁)
.build();
// 執行查詢
AggregatedPage<TestEsDto> testEntities = elasticsearchTemplate.queryForPage(build, TestEsDto.class);
// 取出聚合結果
Aggregations entitiesAggregations = testEntities.getAggregations();
Terms terms = (Terms) entitiesAggregations.asMap().get("sex");
// 遍歷取出聚合字段列的值,與對應的數量
for (Terms.Bucket bucket : terms.getBuckets()) {
String keyAsString = bucket.getKeyAsString(); // 聚合字段列的值
long docCount = bucket.getDocCount();// 聚合字段對應的數量
log.info("keyAsString={},value={}", keyAsString, docCount);
}