最近在开发中遇到一个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来实现

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐