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代表的是颜色,颜色里面再划分下面这几种颜色

 以此类推

然后根据类目划分 

根据品牌划分

结果

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch实战是指在实际应用中使用Elasticsearch来解决问题或实现功能的过程。下面是一些学习Elasticsearch实战的步骤和方法: 1. 首先,了解Elasticsearch的基本概念和特性。可以通过官方文档或在线教程来学习。理解Elasticsearch是一个分布式搜索和分析引擎,可以用于处理大规模数据、实现全文搜索、进行聚合和过滤等功能。 2. 熟悉Elastic Stack的组成部分。Elastic Stack是一个包含多个开源工具的集合,包括Elasticsearch、Kibana、Logstash和Beats。学习如何使用这些工具协同工作,可以帮助你更好地实践Elasticsearch。 3. 学习如何索引和搜索数据。了解如何创建索引、插入和更新文档,以及如何执行搜索和过滤操作。掌握Elasticsearch的查询语法和搜索技巧,可以帮助你更高效地使用Elasticsearch。 4. 学习如何使用聚合和分析功能。Elasticsearch提供了丰富的聚合和分析功能,可以帮助你从数据中提取有用的信息和统计结果。掌握如何使用聚合查询、分组、排序和统计功能,可以帮助你更好地理解和分析数据。 5. 实践中遇到的挑战和解决方案。在实际应用中,你可能会遇到各种问题和挑战。学习如何解决常见的问题,比如性能优化、数据同步和故障恢复等,可以帮助你更好地应对实际情况。 总之,学习Elasticsearch实战需要不断实践和积累经验。掌握基本概念和技巧后,可以通过参与项目、阅读案例和论坛讨论等方式来进一步提升自己的实战能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [大牛耗时两年完成的实战手册。Elasticsearch实战,掌握这些刚刚好!](https://blog.csdn.net/LBWNB_Java/article/details/127864433)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [【十九】springboot整合ElasticSearch实战(万字篇)](https://blog.csdn.net/weixin_56995925/article/details/123873580)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值