ElasticSearch实战

目录

创建索引库

创建索引语句

创建成功

索引数据准备

插入es数据

插入成功

DSL语句实现查询

示例

查询全部

根据关键字查询

多个字段查询

注意

是否有库存(参数是boolean类型)

filter多条件查询

注意

排序

分页功能

高亮展示

结果展示 

聚合函数操作

前言

查询结果

其他示例

下钻分析   

多个聚合条件查询语句

内聚查询

前言

这次文章前言

示例

具体操作

整体查询数据请求

查询数据结果

结果


创建索引库

创建索引语句

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": {
        
      }
    }
  }

结果展示 

聚合函数操作

前言

  1. 这段函数的含义,aggs就是要进行聚合操作了,group_by_color是你自定义的聚合操作,term就是不进行分词按照color这个字段进行分组,order是按照什么顺序进行排序,这个里面的排序还自定义了一个排序,就是在这组颜色中的平均价格排序
  2. 我仔细观察了一下,他后面用的也是个聚合函数,自定义了聚合操作,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代表的是颜色,颜色里面再划分下面这几种颜色

 以此类推

然后根据类目划分 

根据品牌划分

结果

最终实现效果,下图这个功能就实现了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值