ElasticSearch 简单的 搜索 聚合 分析

ElasticSearch 简单的 搜索 聚合 分析一、搜索1.DSL搜索全部数据没有任何条件查询名称包含xxx的商品,同时按照价格降序排序分页查询商品from第几条开始size获取几条查询结果中返回的字段设置2、query

大家好,又见面了,我是你们的朋友全栈君。

一、 搜索
1.DSL搜索

全部数据没有任何条件

GET /shop/goods/_search
{
  "query": { "match_all": {} }
}

 

查询名称包含 xxx 的商品,同时按照价格降序排序

GET /shop/goods/_search
{
    "query" : {
        "match" : {
            "name" : "xxx"
        }
    },
    "sort": [
        { "price": "desc" }
    ]
}

 

分页查询商品 from 第几条开始 size 获取几条

GET /shop/goods/_search
{
  "query" : {
        "match" : {
            "name" : "xxx"
        }
    },
  "from": 1,
  "size": 1
}

 

查询结果中返回的字段 设置

查询结果中返回的字段 设置
GET /shop/goods/_search
{
  "query" : {
        "match" : {
            "name" : "xxx"
        }
    },
  "_source": ["name", "price"]
}

 

 

 

2、query filter

搜索商品名称包含xxx,而且售价大于25元的商品

GET /shop/goods/_search
{
    "query" : {
        "bool" : {
            "must" : {
                "match" : {
                    "name" : "xxx" 
                }
            },
            "filter" : {
                "range" : {
                    "price" : { "gt" : 25 } 
                }
            }
        }
    }
}

 

3、full-text search(全文检索)

GET /shop/goods/_search
{
    "query" : {
        "match" : {
            "producer" : "xxx"
        }
    }
}

 

 

4、phrase search(短语搜索)
短语搜索的功能和全文检索相对应,全文检索会将输入的搜索串拆解开来,去倒排索引里面去一一匹配,只要能匹配上任意一个拆解后的单词,就可以作为结果返回
phrase search,要求输入的搜索串,必须在指定的字段文本中,完全包含一模一样的,才可以算匹配,才能作为结果返回

 

GET /shop/goods/_search
{
    "query" : {
        "match_phrase" : {
            "producer" : "xxx"
        }
    }
}

 

5 highlight search(高亮搜索结果)

高亮优化:
方式1:传统plain高亮方式。
官网明确支持,该方式匹配慢,如果出现性能问题,请考虑其他高亮方式。
方式2: postings 高亮方式。
方式3: fast-vector-highlighter 简称fvh高亮方式。

GET /shop/goods/_search
{
    "query" : {
        "match" : {
            "producer" : "xxx"
        }
    },
    "highlight": {
        "fields" : {
            "producer" : {}
        }
    }
}

 

二、 聚合、分析

5.x以后对排序,聚合这些操作用单独的数据结构(fielddata)缓存到内存里了,需要单独开启。
开启字段的fielddata

PUT /shop/_mapping/goods
{
  "properties": {
    "tags": {
      "type": "text",
      "fielddata": true
    }
  }
}

 

1、计算每个tag下的商品数量

GET /shop/goods/_search
{
  "aggs": {
    "group_by_tags": {
      "terms": { "field": "tags" }
    }
  }
}

 

size表示不返回文档 只返回聚合分析后的结果 group_by_tags和all_tags 只是给本次聚合 起一个名字 没有功能的区别

GET /shop/goods/_search
{
  "size": 0,
  "aggs": {
    "all_tags": {
      "terms": { "field": "tags" }
    }
  }
}

 

 

2、对名称中包含xxx的商品,计算每个tag下的商品数量

GET /shop/goods/_search
{
  "size": 0,
  "query": {
    "match": {
      "name": "yagao"
    }
  },
  "aggs": {
    "all_tags": {
      "terms": {
        "field": "tags"
      }
    }
  }
}

 

3、先分组,再算每组的平均值,计算每个tag下的商品的平均价格

GET /shop/goods/_search
{
    "size": 0,
    "aggs" : {
        "group_by_tags" : {
            "terms" : { "field" : "tags" },
            "aggs" : {
                "avg_price" : {
                    "avg" : { "field" : "price" }
                }
            }
        }
    }
}

 

4、计算每个tag下的商品的平均价格,并且按照平均价格降序排序

GET /shop/goods/_search
{
    "size": 0,
    "aggs" : {
        "all_tags" : {
            "terms" : { "field" : "tags", "order": { "avg_price": "desc" } },
            "aggs" : {
                "avg_price" : {
                    "avg" : { "field" : "price" }
                }
            }
        }
    }
}

 

5、按照指定的价格范围区间进行分组,然后在每组内再按照tag进行分组,最后再计算每组的平均价格

GET /shop/goods/_search
{
  "size": 0,
  "aggs": {
    "group_by_price": {
      "range": {
        "field": "price",
        "ranges": [
          {
            "from": 0,
            "to": 20
          },
          {
            "from": 20,
            "to": 40
          },
          {
            "from": 40,
            "to": 50
          }
        ]
      },
      "aggs": {
        "group_by_tags": {
          "terms": {
            "field": "tags"
          },
          "aggs": {
            "average_price": {
              "avg": {
                "field": "price"
              }
            }
          }
        }
      }
    }
  }
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155270.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Wireshark数据抓包分析之FTP协议

    Wireshark数据抓包分析之FTP协议实验步骤一  配置FTP服务器,并在测试者机器上登录FTP服务器在局域网环境中,我们使用一个小工具来(QuickEasyFTPServer)实现FTP服务器。配置QuickEasyFTPServer 软件双击桌面的QuickEasyFTPServer,如下图如上图,可以创建匿名的,但是匿名就没有密码,这里我们创建一个,下一步输入密码,这里随意,记住即可,后面客户端登录会用到。下一…

    2022年6月22日
    131
  • arping指令linux,arping命令详解「建议收藏」

    arping指令linux,arping命令详解「建议收藏」1版本arping主要就是查看ip的MAC地址及IP占用的问题。arping有两个版本,一个版本是ThomasHabets这个人写的,这个版本有个好处是可以arping,也就是说我们可以通过MAC地址得到IP;还有一个版本是Linuxiputilssuite的,这个版本就不能通过MAC地址,解析出IP地址了。可以使用arping-V查看系统的arping的版本[root@dev-…

    2022年6月10日
    43
  • html表单制作

    html表单制作(后续会持续更新)用到的表单元素:文本区域(textarea)、列表框(select)、文本输入框(inputtype=text)、单选输入框(inputtype=radio)、复选输入框(inputtype=checkbox)、重置按钮(inputtype="reset"value="重置”)、提交按钮(inputtype="submit"value="提交")、密码域(input…

    2022年6月16日
    35
  • redis端口号为什么是6379「建议收藏」

    redis端口号为什么是6379「建议收藏」6379在是手机按键上MERZ对应的号码,而MERZ取自意大利歌女AlessiaMerz的名字。MERZ长期以来被Redis作者antirez及其朋友当作愚蠢的代名词。后来Redis作者在开发Redis时就选用了这个端口。——AlessiaMerz是一位意大利舞女、女演员。Redis作者Antirez早年看电视节目,觉得Merz在节目中的一些话愚蠢可笑,Antirez喜欢造…

    2022年5月30日
    231
  • C++ gbk与utf8互转

    C++ gbk与utf8互转本文代码已在 vs2017 上验证 gbk 转 utf8 容易出现中文乱码 有的时候在 x8632 位编译环境下中文显示正常 但切换到 x6464 位编译环境下会乱码 本文所示的代码在 32 位和 64 位编译环境下均不会出现乱码 使用例子见 include iostream include stdlib h include string include string h include windows h usingnames windows h string h string stdlib h iostream

    2025年6月6日
    4
  • 扫描主机漏洞的工具_漏洞扫描工具有哪些

    扫描主机漏洞的工具_漏洞扫描工具有哪些0x00说明:这是一款基于主机的漏洞扫描工具,采用多线程确保可以快速的请求数据,采用线程锁可以在向sqlite数据库中写入数据避免databaseislocked的错误,采用md5哈希算法确保数据不重复插入。本工具查找是否有公开exp的网站为shodan,该网站限制网络发包的速度,因而采用了单线程的方式,且耗时较长。功能:查找主机上具有的CVE查找具有公开EXP的CVE0x…

    2025年11月2日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号