最近在开发中遇到一个es排序的问题,大概说一下项目需求,一张图片解析结果可以有很多主色调,例如白色、粉色、红色等颜色以及它们的占比,我们把图库中所有的图片都进行解析,将每张图片存最多5个主色调的颜色以及他们的占比到es中,用户可以通过筛选颜色主色调,来挑选他们想要找的色系图片,并通过占比降序,这里es就需要一个字段存储一个数组结构的主色调信息。该字段的数据结构大致如下:
“主色调信息”:[{
"颜色": "白色",
"占比": "0.123456"
} {
"颜色": "黑色",
"占比": "0.223456"
} {
"颜色": "蓝色",
"占比": "0.323456"
}]
一、ES的mapping索引结构
如下,我们以上面的数据结构建索引,这里最重要的就是定义字段类型为"type": "nested"
PUT index_Name {
"mappings": {
"doc": {
"properties": {
"huesInfo": {
"type": "nested",
"include_in_parent": true,
"properties": {
"hues": {
"type": "keyword"
},
"ratio": {
"type": "double"
}
}
}
}
}
}
}
二、插入数据
模拟几条数据进行测试
POST index_Name/doc/1
{
"huesInfo":[{
"hues":"WhiteColors",
"ratio":0.123456
},{
"hues":"RedColors",
"ratio":0.323456
},{
"hues":"BlueColors",
"ratio":0.423456
}]
}
三、es查询
选择指定主色调,并按照所选主色调占比由高到低得分排序
例如选择了白色主色调,es语法例子:
GET index_Name/ _search {
"query": {
"bool": {
"must": [{
"term": {
"huesInfo.hues": {
"value": "WhiteColors"
}
}
}]
}
},
"sort": {
"huesInfo.ratio": {
"order": "desc",
"mode": "max",
"nested_path": "huesInfo",
"nested_filter": {
"match": {
"huesInfo.hues": {
"query": "WhiteColors"
}
}
}
}
}
}
在实际的开发中,springboot整合es的工具类中可以使用如下NestedQueryBuilder的api来实现