目录
创建索引库
创建索引语句
PUT product_db
{
"mappings": {
"properties": {
"id": {
"type": "long"
},
"name": {
"type": "text",
"analyzer": "ik_max_word"
},
"keywords": {
"type": "text",
"analyzer": "ik_max_word"
},
"subTitle": {
"type": "text",
"analyzer": "ik_max_word"
},
"salecount":{
"type": "long"
},
"putawayDate":{
"type": "date"
},
"price": {
"type": "double"
},
"promotionPrice": {
"type": "keyword"
},
"originalPrice": {
"type": "keyword"
},
"brandName": {
"type": "keyword"
},
"brandImg": {
"type": "keyword"
},
"categoryId": {
"type": "long"
},
"categoryName": {
"type": "keyword"
}
}
}
}
创建成功
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "product_db"
}
索引数据准备
插入es数据
很多数据都省略没写,省点行数
插入成功
这个当时是一条数据一条数据插入的,下面这个代表id为1的成功插入
{
"_index" : "product_db",
"_type" : "_doc",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
DSL语句实现查询
示例
看一下示例具体要查哪些东西
查询全部
根据关键字查询
name中含有手机关键字的
POST /product_db/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "手机"
}
}
]
}
}
}
多个字段查询
查询手机,品牌还必须是小米的
POST /product_db/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "手机"
}
},
{
"match": {
"brandName": "小米"
}
}
]
}
}
}
注意
使用must是带评分的,使用filter是不带评分的,效率会高那么一点
是否有库存(参数是boolean类型)
这种查询,老师使用term进行搜索的
filter多条件查询
关键词手机,是否有库存,以及价格范围查询
POST /product_db/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "手机"
}
}
],
"filter": [
{
"term": {
"hasStock": true
}
},
{
"range":{
"price":{
"from":2500,
"to":5000
}
}
}
]
}
}
}
注意
一个json就是一个查询条件,条件和条件之间用逗号分隔
看一下这么查也可以,must和filter后面的条件,一个json接着一个json的,一个条件一个条件加上去
POST /product_db/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "手机"
}
},
{
"term": {
"hasStock": true
}
},
{
"range":{
"price":{
"from":2500,
"to":5000
}
}
}
],
"filter": [
]
}
}
}
排序
POST /product_db/_search
{
"sort": [
{
"FIELD": {
"order": "desc"
}
}
]
}
按销量降序排序
分页功能
高亮展示
这块位置的查询条件,展示出来关键字需要高亮展示
高亮包括前置和后置标签,需要对哪些字段做高亮也要声明
"highlight": {
"pre_tags": "<b style='color:red'>",
"post_tags": "</b>",
"fields": {
"name": {
}
}
}
结果展示
聚合函数操作
前言
- 这段函数的含义,aggs就是要进行聚合操作了,group_by_color是你自定义的聚合操作,term就是不进行分词按照color这个字段进行分组,order是按照什么顺序进行排序,这个里面的排序还自定义了一个排序,就是在这组颜色中的平均价格排序
- 我仔细观察了一下,他后面用的也是个聚合函数,自定义了聚合操作,avg_by_price,就是相当于在这个颜色里面又进行了聚合,里面用的avg函数,我理解就是对外层的这个组进行某个字段的平均,如果这个操作不是avg而是terms,那估计还会再里面再进行分组?
查询结果
其他示例
这次我们按照品牌的id进行分组,查询结果发现id为6的品牌里面有2个,id为59的品牌有一个数据,其实跟我的要求不匹配,我们要求要像下面这样按照品牌展示,然后要他的名字和图片url,这里面的size就是做一个限制,要显示几个
解决方案:一个是通过查询出来的id接着再去查询他的名称和url,这种分两次去查询,老师说效率不高,有一个方案就是继续聚合查询,下钻分析
下钻分析
看一下查询语句和查询出来的结果,我们可以看出来分组之后,又进行了分组,对brandName又进行了分组,这里面没有指定size,因为我们对品牌名称进行分组的话,一个id对应一个名称,不会出现多个的情况,跟我们当时分析车的颜色那个聚合对上了
查询结果可以看到品牌的名称了
如果我们继续要看到品牌的url,有两种方式一种是继续下钻分析,一个是并列查询
并列查询
主要观察里面自定义agg名称的位置
继续下钻分析
主要观察里面自定义agg名称的位置
多个聚合条件查询语句
查询出来的结果
他这个结果就是,不是当做整个条件来查,而是当做一个一个条件来查的,按照brand_agg和category_agg结果分别来查询的结果进行展示出来
内聚查询
前言
看一下下面这个图的查询条件和查询结果,查询条件是查询一个人,符合这个条件,就是省份在北京,城市在天津,但是你看查询出来的结果不符合我们的要求,这个结果是他之前带过省份在北京,但是城市也是北京,也待过省份是天津,城市是天津的,就是没有省份在北京,城市在天津的
这种情况出现的原因,是因为es做了扁平化处理
当时的解决方案,用下面这个索引库,你再用上面的语句去查就啥也查不到了,建索引的时候,索引类型是type:nested,这种就是内聚的查询方式,address的相关搜索都得在一个address里面进行查询,不能跨address信息去查询
这次文章前言
看一下当时建索引attrs这个字段
里面的内容,跟那个省份和城市一样的结构
示例
"attr_agg":{
"terms": {
"field": "attrs.attrId"
}
}
我们按照之前的聚合查询方式进行查询,是查不到的
看一下官方示例怎么查询的
具体操作
我们按照官方的来写,我们来理解一下下面这大段,我们对attrs这个字段进行nested操作,其他后面再接着写,先看查询出来的结果
"attr_agg": {
"nested": {
"path": "attrs"
},
"aggregations": {
"attr_id_agg": {
"terms": {
"field": "attrs.attrId"
},
"aggregations": {
"attr_name_agg": {
"terms": {
"field": "attrs.attrName"
}
},
"attr_value_agg": {
"terms": {
"field": "attrs.attrValue"
}
}
}
}
}
}
整体查询数据请求
POST /product_db/_search
{
"from": 0,
"size": 20,
"query": {
"bool": {
"must": [
{
"match": {
"name": "手机"
}
}
],
"filter": [
{
"range": {
"price": {
"from": 1,
"to": 10000
}
}
}
]
}
},
"sort": [
{
"salecount": {
"order": "desc"
}
}
],
"highlight": {
"pre_tags": "<b style='color:red'>",
"post_tags": "</b>",
"fields": {
"name": {}
}
},
"aggs": {
"brand_agg": {
"terms": {
"field": "brandId",
"size": 10
},
"aggs": {
"brand_name_agg": {
"terms": {
"field": "brandName"
},
"aggs": {
"brand_url_agg": {
"terms": {
"field": "brandImg"
}
}
}
}
}
},
"category_agg": {
"terms": {
"field": "categoryId",
"size": 10
},
"aggs": {
"category_name_agg": {
"terms": {
"field": "categoryName"
}
}
}
},
"attr_agg": {
"nested": {
"path": "attrs"
},
"aggregations": {
"attr_id_agg": {
"terms": {
"field": "attrs.attrId"
},
"aggregations": {
"attr_name_agg": {
"terms": {
"field": "attrs.attrName"
}
},
"attr_value_agg": {
"terms": {
"field": "attrs.attrValue"
}
}
}
}
}
}
}
}
查询数据结果
根据规格分类
根据attr_id划分,第一个桶子里面关于cpu的,里面再划分分为2核和4核的
第二个桶子里面,id代表的是颜色,颜色里面再划分下面这几种颜色
以此类推
然后根据类目划分
根据品牌划分
结果
最终实现效果,下图这个功能就实现了