1. 程式人生 > >Elasticsearch(七)資訊檢索與結果過濾

Elasticsearch(七)資訊檢索與結果過濾

Elasticsearch: 6.4.2

聚合分類:

Bucketing聚合: 類似SQL中的GROUP BY;基於檢索構成了邏輯文件組,滿足特定規則的文件放置到一個桶裡,每一個桶關聯一個key; 分桶聚合可以巢狀分桶聚合。

Metric聚合: 基於一組文件進行聚合。所有的文件在一個檢索集合裡,文件被分成邏輯的分組; 對一個數據集求最大、最小、和、平均值等指標的聚合。

Matrix聚合: 此功能是實驗性的,可在將來的版本中完全更改或刪除;在多個欄位上操作,並根據從請求的文件中提取的值生成矩陣結果。

Pipeline聚合:對聚合的結果而不是原始資料集進行操作。

測試資料

POST userinfo/
doc/_bulk { "index": { "_id": "1" } } { "username": "alfred way", "job": "java engineer", "age": 18, "birth": "1990-01-02", "isMarried": false, "salary": 10000 } { "index": { "_id": "2" } } { "username": "tom", "job": "java senior engineer", "age": 28, "birth": "1980-05-07",
"isMarried": true, "salary": 30000 } { "index": { "_id": "3" } } { "username": "lee", "job": "ruby engineer", "age": 22, "birth": "1985-08-07", "isMarried": false, "salary": 15000 } { "index": { "_id": "4" } } { "username": "Nick", "job": "web engineer", "age": 23, "birth"
: "1989-08-07", "isMarried": false, "salary": 8000 } { "index": { "_id": "5" } } { "username": "Niko", "job": "web engineer", "age": 18, "birth": "1994-08-07", "isMarried": false, "salary": 5000 } { "index": { "_id": "6" } } { "username": "Michell", "job": "ruby engineer", "age": 26, "birth": "1987-08-07", "isMarried": false, "salary": 12000 }
  • Metric聚合

    最值、求和、均值

    POST /userinfo/doc/_search
    {
      "size": 0,
      "aggs": {
        "avg_grade": {
          "avg": {  # 可以使用max、min、sum
            "field": "salary"
          }
        }
      }
    }
    

    Cardinality

    類似於SQL中的district count

    POST /userinfo/doc/_search
    {
      "size": 0, 
      "aggs": {
        "type_count": {
          "cardinality": {
            "field": "job.keyword"
          }
        }
      }
    }
    

    Stats

    返回一系列數值型別的統計值,包括min,max,avg,sum,count。

    POST /userinfo/doc/_search
    {
        "size":0,
        "aggs":{
            "stats_age":{
                "stats":{
                    "field":"age"
                }
            }
        }
    }
    

    Extended Stats

    Stats聚合的擴充套件,包含更多統計資料,例如:方差,標準差等。

    POST /userinfo/doc/_search
    {
        "size":0,
        "aggs":{
            "stats_age":{
                "extended_stats":{
                    "field":"age"
                }
            }
        }
    }
    

    Percentiles

    # 百分位數統計
    POST /userinfo/doc/_search
    {
        "size":0,
        "aggs":{
            "per_age":{
                "percentiles":{
                    "field":"salary"
                }
            }
        }
    }
    # 針對特定值計算百分位數
    POST /userinfo/doc/_search
    {
        "size":0,
        "aggs":{
            "per_age":{
                "percentile_ranks":{
                    "field":"salary",
                    "values":[
                        11000,
                        30000
                    ]
                }
            }
        }
    }
    # 針對特定百分位數計算對應的值 
    POST /userinfo/doc/_search
    {
        "size":0,
        "aggs":{
            "per_age":{
                "percentiles":{
                    "field":"salary",
                    "percents" : [80, 95, 99, 99.9] 
                }
            }
        }
    }
    

    Top Hits

    一般用於分桶後獲取該桶內最匹配的頂部文件詳情資料

    # 先根據job分桶,後在桶內根據age排序
    POST /userinfo/doc/_search
    {
        "size":0,
        "aggs":{
            "jobs":{
                "terms":{
                    "field":"job.keyword",
                    "size":10
                },
                "aggs":{
                    "top_employee":{
                        "top_hits":{
                            "size":10,
                            "sort":[
                            {
                                "age":{
                                    "order":"desc"
                                }
                            }
                            ]
                        }
                    }
                }
            }
        }
    }
    
  • Bucketing聚合

    Terms

    改分桶策略最簡單,直接根據term分桶,如果是text型別,則按照分析器處理後的結果分桶。

    POST /userinfo/doc/_search
    {
        "size":0,
        "aggs":{
            "jobs":{
                "terms":{
                    "field":"job.keyword",
                    "size":10
                }
            }
        }
    }
    

    Range

    通過指定數值的範圍來設定分桶規則

    POST /userinfo/doc/_search
    {
        "size":0,
        "aggs":{
            "salary_range":{
                "range":{
                    "field":"salary",
                    "ranges":[
                    {
                        "to":10000
                    },
                    {
                        "from":10000,
                        "to":20000
                    },
                    {
                        "from":20000
                    }
                    ]
                }
            }
        }
    }
    

    Date Range

    通過指定日期的範圍來設定分桶規則

    POST /userinfo/doc/_search
    {
        "size":0,
        "aggs":{
            "date_range":{
                "range":{
                    "field":"birth",
                    "format":"yyyy",
                    "ranges":[
                    {
                        "from":"1980",
                        "to":"1990"
                    },
                    {
                        "from":"1990",
                        "to":"2000"
                    },
                    {   
                        "from":"2000"
                    }
                    ]
                }
            }
        }
    }
    

    Historgram

    以固定間隔來分割資料

    POST /userinfo/doc/_search
    {
        "size":0,
        "aggs":{
            "salary_hist":{
                "histogram":{
                    "field":"salary",
                     "interval":5000,
                     "extended_bounds":{
                        "min":0,
                        "max":40000
                     }
                }
            }
        }
    }
    

    Date Historgram

    針對日期的直方圖

    POST /userinfo/doc/_search
    {
        "size":0,
        "aggs":{
            "salary_hist":{
                "date_histogram":{
                    "field":"birth",
                     "interval":"year",
                     "format":"yyyy"
                }
            }
        }
    }
    

    Filter

    將滿足過濾條件的文件放入桶中

    POST /userinfo/doc/_search
    {
      "size": 0, 
      "aggs": {
        "salary_aggs": {
          "filter": {
            "range": {
              "salary": {
                "gte": 10000
              }
            }
          },
          "aggs": {
            "avg_salary": {
              "avg": {
                "field": "salary"
              }
            }
          }
        }
      }
    }
    

    Missing

    統計缺少指定欄位的文件個數。

    POST /userinfo/doc/_search
    {
      "size": 0, 
      "aggs": {
        "miss_aggs": {
          "missing": {
            "field": "phone"
          }
        }
      }
    }
    
  • Pipeline聚合

    針對聚合分析的結果再次進行聚合分析,而且支援鏈式呼叫。

    Pipeline的分析結果會輸出到原結果中,根據輸出位置的不同,分為以下兩類:

    1. Parent結果內嵌到現有的聚合分析結果中
    • Derivative

    • Moving Average

    • Cumulative Sum

    1. Sibling結果與現有聚合分析結果同級
    • Max/Min/Avg/Sum Bucket

    • Stats/Extended Stats Bucket

    • Percentitles Bucket

    Sibing-Derivative

    先根據job分桶並計算各個分桶的avg值,然後輸出avg最小的桶名稱和值

    POST /userinfo/doc/_search
    {
        "size":0,
        "aggs":{
            "jobs":{
                "terms":{
                    "field":"job.keyword",
                    "size":10
                },
                "aggs":{
                    "avg_salary":{
                        "avg":{
                            "field":"salary"
                        }
                    }
                }
            },
            "min_salary_by_job":{
                "min_bucket":{
                    "buckets_path":"jobs>avg_salary"
                }
            }
        }
    }
    

    先根據job分桶並計算各個分桶的avg值,然後對所有bucket進行stats分析

    POST /userinfo/doc/_search
    {
        "size":0,
        "aggs":{
            "jobs":{
                "terms":{
                    "field":"job.keyword",
                    "size":10
                },
                "aggs":{
                    "avg_salary":{
                        "avg":{
                            "field":"salary"
                        }
                    }
                }
            },
            "stats_salary_by_job":{
                "stats_bucket":{
                    "buckets_path":"jobs>avg_salary"
                }
            }
        }
    }
    

    Parent-Derivative

    計算bucket的導數

    POST /userinfo/doc/_search
    {
        "size":0,
        "aggs":{
            "birth":{
                "date_histogram":{
                    "field":"birth",
                    "interval":"year",
                    "min_doc_count":0
                },
                "aggs":{
                    "avg_salary":{
                        "avg":{
                            "field":"salary"
                        }
                    },
                    "derivative_avg_salary":{
                        "derivative":{
                            "buckets_path":"avg_salary"
                        }
                    }
                }
            }
        }
    }
    
  • Bucket+Metric聚合分析

    先根據job進行term分桶策略,然後再對每一個分桶進行range分桶策略

    POST /userinfo/doc/_search
    {
        "size":0,
        "aggs":{
            "jobs":{
                "terms":{
                    "field":"job.keyword",
                    "size":10
                },
                "aggs":{
                    "age_range":{
                        "range":{
                            "field":"age",
                            "ranges":[
                            {"to":20},
                            {"from":20,"to":30},
                            {"from":30}
                            ]
                        }
                    }
                }
            }
        }
    }
    
  • 搜尋提示

    _suggestURI已經被_search所替代,使用suggest屬性。

    POST /userinfo/doc/_search
    {
      "query": {
        "match": {
          "job": "web"
        }
      },
      "suggest": {
        "me_SUGGESTION": {
          "text": "web",
          "term": {
            "field": "job"
          }
        }
      }
    }