ElasticSearch 簡單的 搜尋 聚合 分析

奮程式序猿發表於2018-04-16

一、 搜尋
1.DSL搜尋

全部資料沒有任何條件

GET /shop/goods/_search
{
  "query": { "match_all": {} }
}

 

查詢名稱包含 xxx 的商品,同時按照價格降序排序

GET /shop/goods/_search
{
    "query" : {
        "match" : {
            "name" : "xxx"
        }
    },
    "sort": [
        { "price": "desc" }
    ]
}

 


分頁查詢商品 from 第幾條開始 size 獲取幾條

GET /shop/goods/_search
{
  "query" : {
        "match" : {
            "name" : "xxx"
        }
    },
  "from": 1,
  "size": 1
}

 


查詢結果中返回的欄位 設定

查詢結果中返回的欄位 設定
GET /shop/goods/_search
{
  "query" : {
        "match" : {
            "name" : "xxx"
        }
    },
  "_source": ["name", "price"]
}

 

 

 


2、query filter


搜尋商品名稱包含xxx,而且售價大於25元的商品

GET /shop/goods/_search
{
    "query" : {
        "bool" : {
            "must" : {
                "match" : {
                    "name" : "xxx" 
                }
            },
            "filter" : {
                "range" : {
                    "price" : { "gt" : 25 } 
                }
            }
        }
    }
}

 


3、full-text search(全文檢索)

GET /shop/goods/_search
{
    "query" : {
        "match" : {
            "producer" : "xxx"
        }
    }
}

 

 

4、phrase search(短語搜尋)
短語搜尋的功能和全文檢索相對應,全文檢索會將輸入的搜尋串拆解開來,去倒排索引裡面去一一匹配,只要能匹配上任意一個拆解後的單詞,就可以作為結果返回
phrase search,要求輸入的搜尋串,必須在指定的欄位文字中,完全包含一模一樣的,才可以算匹配,才能作為結果返回

 

GET /shop/goods/_search
{
    "query" : {
        "match_phrase" : {
            "producer" : "xxx"
        }
    }
}

 

5 highlight search(高亮搜尋結果)

高亮優化:
方式1:傳統plain高亮方式。
官網明確支援,該方式匹配慢,如果出現效能問題,請考慮其他高亮方式。
方式2: postings 高亮方式。
方式3: fast-vector-highlighter 簡稱fvh高亮方式。

GET /shop/goods/_search
{
    "query" : {
        "match" : {
            "producer" : "xxx"
        }
    },
    "highlight": {
        "fields" : {
            "producer" : {}
        }
    }
}

 

二、 聚合、分析


5.x以後對排序,聚合這些操作用單獨的資料結構(fielddata)快取到記憶體裡了,需要單獨開啟。
開啟欄位的fielddata

PUT /shop/_mapping/goods
{
  "properties": {
    "tags": {
      "type": "text",
      "fielddata": true
    }
  }
}

 

1、計算每個tag下的商品數量

GET /shop/goods/_search
{
  "aggs": {
    "group_by_tags": {
      "terms": { "field": "tags" }
    }
  }
}

 

size表示不返回文件 只返回聚合分析後的結果 group_by_tags和all_tags 只是給本次聚合 起一個名字 沒有功能的區別

GET /shop/goods/_search
{
  "size": 0,
  "aggs": {
    "all_tags": {
      "terms": { "field": "tags" }
    }
  }
}

 

 

2、對名稱中包含xxx的商品,計算每個tag下的商品數量

GET /shop/goods/_search
{
  "size": 0,
  "query": {
    "match": {
      "name": "yagao"
    }
  },
  "aggs": {
    "all_tags": {
      "terms": {
        "field": "tags"
      }
    }
  }
}

 


3、先分組,再算每組的平均值,計算每個tag下的商品的平均價格

GET /shop/goods/_search
{
    "size": 0,
    "aggs" : {
        "group_by_tags" : {
            "terms" : { "field" : "tags" },
            "aggs" : {
                "avg_price" : {
                    "avg" : { "field" : "price" }
                }
            }
        }
    }
}

 


4、計算每個tag下的商品的平均價格,並且按照平均價格降序排序

GET /shop/goods/_search
{
    "size": 0,
    "aggs" : {
        "all_tags" : {
            "terms" : { "field" : "tags", "order": { "avg_price": "desc" } },
            "aggs" : {
                "avg_price" : {
                    "avg" : { "field" : "price" }
                }
            }
        }
    }
}

 


5、按照指定的價格範圍區間進行分組,然後在每組內再按照tag進行分組,最後再計算每組的平均價格

GET /shop/goods/_search
{
  "size": 0,
  "aggs": {
    "group_by_price": {
      "range": {
        "field": "price",
        "ranges": [
          {
            "from": 0,
            "to": 20
          },
          {
            "from": 20,
            "to": 40
          },
          {
            "from": 40,
            "to": 50
          }
        ]
      },
      "aggs": {
        "group_by_tags": {
          "terms": {
            "field": "tags"
          },
          "aggs": {
            "average_price": {
              "avg": {
                "field": "price"
              }
            }
          }
        }
      }
    }
  }
}

 

相關文章