大家期盼已久的ES8.2将可能在5月初发布,该版本会带来3个突出的新特性
-
Support ANN with filtering
ES8.0支持的knn_search查询首次实现了大数据场景下的向量近邻搜索,但是美中不足的是不支持配合DLL语法进行数据筛选;不过经过社区同学的努力该问题得到了重视,官方承诺会在后续的版本陆续解决,第一步是在8.2中引入了filter语法
POST index/_knn_search
{
"knn": {
"field": "image_vector",
"query_vector": [0.3f, 0.1f, ...],
"k": 10,
"num_candidates": 100
},
"filter": {
"term": {
"file_type": "jpeg"
}
}
}
有了这个支持,那么我们可以将检索结果的TopN商品作为过滤条件,通过向量近邻搜索对商品精细化排序了,如实现经典的双塔模型排序
-
Enhance runtime field
当业务中忘了定义某些字段,或者早期定义的字段类型或类型格式不符合当下业务场景时,可通过新增运行时字段来修正;如 我们希望对商品检索结果按照所属分类进行聚合,但不幸的是存放商品的字段是一个包含多个品类的text字符串,很显然这个字段是不能进行聚合操作的,我们要做的是在runtime_mappings中定义一个类型为keyword的category字段即可
POST my-index-000001/_search
{
"runtime_mappings": {
"category": {
"type": "keyword",
"script": {
"source":
"""if (doc['navigator_ids].value.contains('123456'))
{emit('123456');}
else if (doc['navigator_ids].value.contains('234567'))
{emit('234567');}"""
}
}
},
"query": {
"navigator_ids": [
"123456",
"234567"
]
},
"_source": false,
"size": ,
"collapse": {
"field": "category",
"inner_hits": {
"size":10,
"_source": [
"product_quality_score",
"title",
"gid",
"id",
"type"
]
}
},
}
-
Aggregation for sampling documents
抽样是数据分析中常用的手段,虽然ES提供了强大的数据分析能力,但是在大数据量下进行聚合查询依然会拖慢整个集群,进而影响到线上的正常查询业务;那么通过random_sampler语法可近似查看数据趋势,是一种不错的折中选择
{
"aggregations": {
"sampling": {
"random_sampler": {
"probability": 0.1
},
"aggs": {
"price_percentiles": {
"percentiles": {
"field": "taxful_total_price"
}
}
}
}
}
}