elasticsearch小白入門踩坑(1)

小白入門Es,實際開發中遇到的一些不容易注意到的點, 做個總結, 希望可以幫助同級別小白

1,聚合查詢,多層桶過濾時,外層桶返回條數要儘可能大一些,默認10條

{
     "size" 10 ,
     "query" : {
         "bool" : {
             "must" : [
                {
                     "range" : {
                         "addTime" : {
                             "from" "2021-06-01 00:00:00" ,
                             "to" "2021-06-30 23:59:59" ,
                             "include_lower" true ,
                             "include_upper" true ,
                             "boost" 1.0
                        }
                    }
                }
            ],
             "adjust_pure_negative" true ,
             "boost" 1.0
        }
    },
     "aggregations" : {
         "goods_group" : {
             "terms" : {
                 "field" "goodClassifyIdLevel1" ,
                 "size" 10 ,//第一層桶返回條數
                 "min_doc_count" 1 ,
                 "shard_min_doc_count" 0 ,
                 "show_term_doc_count_error" true ,
                 "order" : [
                    {
                         "_count" "desc"
                    },
                    {
                         "_key" "asc"
                    }
                ]
            },
             "aggregations" : {
                 "sum_orderPrice" : {
                     "sum" : {
                         "field" "goodsAmount"
                    }
                },
                 "sum_buyCount" : {
                     "sum" : {
                         "field" "buyCount"
                    }
                }
            }
        }
    }
}

2, 率重字段: cardinality 類似與mysql的 distinct

Elasticsearch 提供的首個近似聚合是 cardinality (注:基數)度量。 它提供一個字段的基數,即該字段的 distinct 或者 unique 值的數目。

cardinality 度量是一個近似算法。 它是基於 HyperLogLog++ (HLL)算法的。 HLL 會先對我們的輸入作哈希運算,然後根據哈希運算的結果中的 bits 做概率估算從而得到基數。

我們不需要理解技術細節(如果確實感興趣,可以閱讀這篇論文), 但我們最好應該關注一下這個算法的 特性 

  • 可配置的精度,用來控制內存的使用(更精確 = 更多內存)。
  • 小的數據集精度是非常高的。
  • 我們可以通過配置參數,來設置去重需要的固定內存使用量。無論數千還是數十億的唯一值,內存使用量只與你配置的精確度相關。

要配置精度,我們必須指定 precision_threshold 參數的值。 這個閾值定義了在何種基數水平下我們希望得到一個近乎精確的結果。參考以下示例:

GET /cars/transactions/_search
{
    "size" : 0,
    "aggs" : {
        "distinct_colors" : {
            "cardinality" : {
              "field" : "color",
              "precision_threshold" : 100 
            }
        }
    }
}
 
拷貝爲 curl 在 Sense 中查看 

 

precision_threshold 接受 0–40,000 之間的數字,更大的值還是會被當作 40,000 來處理。

總之:這個函數不精確, 數據小還行, 反過來說數據小誰用Es呢, 多此一舉

3,創建索引時,一定要指定索引類型, 手動創建, 或者後期需要追加索引字段, 也要手動追加, 千萬不要讓Es自動生成, 否則等數據全量同步Es後, 再改就麻煩了

 ##  ##  ##  ## 手動設置字段類型

POST / 索引名 / 索引類型 / _mapping {
    "properties": {
        "time": {
            "type": "date",
            "format": "yyyy-MM-dd HH:mm:ss"
        },
        "totalPrice": {
            "type": "double"
        }
    }
}

貼一個追加索引字段的方式吧
POST / 索引名 / _mapping / 索引類型 {
    "properties": {
        "字段1": {
            "type": "keyword"//類型
        },
        ......
    }
}

4,強烈建議上傳Es數據時,指定_id, 比如用數據庫主鍵id, 因爲Es不支持更新, 但支持覆蓋, 通過指定id進行覆蓋實現更新

    至少不擔心同步數據時會重複

5.先寫這幾個吧  開始忙了......

 

有不對的地方  希望大佬多指教

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章