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.先写这几个吧  开始忙了......

 

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

 

 

 

 

 

 

 

 

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