草庐IT

ElasticSearch实战

开水烫蛤蟆 2024-05-14 原文

目录

创建索引库

创建索引语句

创建成功

索引数据准备

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

 以此类推

然后根据类目划分 

根据品牌划分

结果

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

有关ElasticSearch实战的更多相关文章

  1. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  2. ruby - Rails Elasticsearch 聚合 - 2

    不知何故,我似乎无法获得包含我的聚合的响应...使用curl它按预期工作:HBZUMB01$curl-XPOST"http://localhost:9200/contents/_search"-d'{"size":0,"aggs":{"sport_count":{"value_count":{"field":"dwid"}}}}'我收到回复:{"took":4,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":90,"max_score":0.0,"hits":[]},"a

  3. elasticsearch源码关于TransportSearchAction【阶段三】 - 2

    1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>

  4. ruby-on-rails - 使用 Rails (Tire) 和 ElasticSearch 进行模糊字符串匹配 - 2

    我有一个Rails应用程序,现在设置了ElasticSearch和Tiregem以在模型上进行搜索,我想知道我应该如何设置我的应用程序以对模型中的某些索引进行模糊字符串匹配。我将我的模型设置为索引标题、描述等内容,但我想对其中一些进行模糊字符串匹配,但我不确定在何处进行此操作。如果您想发表评论,我将在下面包含我的代码!谢谢!在Controller中:defsearch@resource=Resource.search(params[:q],:page=>(params[:page]||1),:per_page=>15,load:true)end在模型中:classResource'Us

  5. 美团外卖搜索基于Elasticsearch的优化实践 - 2

    美团外卖搜索工程团队在Elasticsearch的优化实践中,基于Location-BasedService(LBS)业务场景对Elasticsearch的查询性能进行优化。该优化基于Run-LengthEncoding(RLE)设计了一款高效的倒排索引结构,使检索耗时(TP99)降低了84%。本文从问题分析、技术选型、优化方案等方面进行阐述,并给出最终灰度验证的结论。1.前言最近十年,Elasticsearch已经成为了最受欢迎的开源检索引擎,其作为离线数仓、近线检索、B端检索的经典基建,已沉淀了大量的实践案例及优化总结。然而在高并发、高可用、大数据量的C端场景,目前可参考的资料并不多。因此

  6. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  7. 【Elasticsearch基础】Elasticsearch索引、文档以及映射操作详解 - 2

    文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就

  8. 你真正了解什么是接口测试么?接口实战一“篇”入魂 - 2

    最近在工作中,看到一些新手测试同学,对接口测试存在很多疑问,甚至包括一些从事软件测试3,5年的同学,在聊到接口时,也是一知半解;今天借着这个机会,对接口测试做个实战教学,顺便总结一下经验,分享给大家。计划拆分成4个模块跟大家做一个分享,(接口测试、接口基础知识、接口自动化、接口进阶)感兴趣的小伙伴记得关注,希望对你的日常工作和求职面试,带来一些帮助。注:文章较长有5000多字,希望小伙伴们认真看完,当然有些内容对小白同学不是太友好,如果你需要详细了解其中的一些概念或者名词,请在文章之后留言,后续我将针对大家的疑问,整理输出一些大家感兴趣的文章。随着开发模式的迭代更新,前后端分离已不是新的概念,

  9. ruby-on-rails - Elasticsearch 问题 : Cannot connect AWS elasticsearch service - 2

    我有一个关于配置elasticsearch以连接AWSelasticsearch服务以在生产环境中运行项目的问题。我的gem文件:gem'searchkick'gem'faraday_middleware-aws-signers-v4'gem'aws-sdk','~>2'gem"elasticsearch",">=1.0.15"引用:https://github.com/ankane/searchkick我的config/initializers/elasticsearch.rb文件:require"faraday_middleware/aws_signers_v4"ENV["ELAS

  10. linux查看es节点使用情况,elasticsearch(es) 如何查看当前集群中哪个节点是主节点(master) - 2

    elasticsearch查看当前集群中的master节点是哪个需要使用_cat监控命令,具体如下。查看方法es主节点确定命令,以kibana上查看示例如下:GET_cat/nodesv返回结果示例如下:ipheap.percentram.percentcpuload_1mload_5mload_15mnode.rolemastername172.16.16.188529952.591.701.45mdi-elastic3172.16.16.187329950.990.991.19mdi-elastic2172.16.16.231699940.871.001.03mdi-elastic4172

随机推荐