es-04搜索和查询

news2024/7/6 21:15:12

文章目录

  • 搜索和查询
    • 查询的上下文
    • 查询语法
      • 1.Searchtimeout:
      • 2.ES常用查询:
        • (1)Query_string:
        • (2)Query DSL:
        • (3)Full-text queries:全文检索
        • (5)Query and filter:查询和过滤
      • Deep paging图解
      • Scroll search:图解
      • filter缓存原理:图解

搜索和查询

查询的上下文

	{
	  #请求消耗的时间 ms
	  "took" : 722,
	  #是否超时
	  "timed_out" : false,
	  #当前请求的分片
	  "_shards" : {
	  	#分片的总数
	    "total" : 1,
	    #成功的个数
	    "successful" : 1,
	    #跳过的个数
	    "skipped" : 0,
	    #失败的个数
	    "failed" : 0
	  },
	  #真正返回的结果
	  "hits" : {
	  	#结果的总数
	    "total" : {
	      #查询到的结果个数,不是返回显示的个数
	      "value" : 2,
	      #查询关系
	      "relation" : "eq"
	    },
	    #当前最大的评分
	    "max_score" : 1.0,
	    #具体的结果
	    "hits" : [
	      {
	      	#索引
	        "_index" : "product",
	        #类型
	        "_type" : "_doc",
	        #id
	        "_id" : "1",
	        #相关度评分
	        "_score" : 1.0,
	        #具体的结果详情,元数据
	        "_source" : {
	          "name" : "xiami phone",
	          "desc" : "shouji zhong de jianjiji",
	          "price" : 4999,
	          "tags" : [
	            "xingjiabi",
	            "fashao",
	            "buka"
	          ]
	        }
	      },
	      {
	        "_index" : "product",
	        "_type" : "_doc",
	        "_id" : "2",
	        "_score" : 1.0,
	        "_source" : {
	          "name" : "xiami nfc phone",
	          "desc" : "zhichi quangongneng nfc,shouji zhong de jianjiji",
	          "price" : 49995,
	          "tags" : [
	            "xingjiabi",
	            "fashao",
	            "gongjiaoka"
	          ]
	        }
	      }
	    ]
	  }
	}

查询语法

1.Searchtimeout:

(1)设置:默认没有timeout,如果设置了timeout,那么会执行timeout机制。
(2)Timeout机制:假设用户查询结果有1W条数据,但是需要10″才能查询完毕,但是用户设置了1″的timeout,那么不管当前一共查询到了多少数据,都会在1″后ES讲停止查询,并返回当前数据。
(3)用法:GET /_search?timeout=1s/ms/m

2.ES常用查询:

(1)Query_string:

  • ①查询所有:GET /product/_search
  • ②带参数:GET /product/_search?q=name:xiaomi
  • ③分页:GET /product/_search?from=0&size=2&sort=price:asc

(2)Query DSL:

  • ①match_all:匹配所有
	GET /product/_search
	{
	  "query":{
	    "match_all": {}
	  }
	}
  • ②match:name中包含“nfc”
	GET /product/_search
	{
	  "query": {
	    "match": {
	      "name": "nfc"
	    }
	  }
	}
  • ③sort:按照价格倒序排序
	GET /product/_search
	{
	  "query": {
	    "multi_match": {
	      "query": "nfc",
	      "fields": ["name","desc"]
	    }
	  },
	  "sort": [
	    {
	      "price": "desc"
	    }
	  ]
	}
  • ④multi_match:根据多个字段查询一个关键词,name和desc中包含“nfc”的doc
	GET /product/_search
	{
	  "query": {
	    "multi_match": {
	      "query": "nfc",
	      "fields": ["name","desc"]
	    }
	  },
	  "sort": [
	    {
	      "price": "desc"
	    }
	  ]
	}
  • ⑤_source 元数据:想要查询多个字段,例子中为只查询“name”和“price”字段。
	GET /product/_search
	{
	  "query":{
	    "match": {
	      "name": "nfc"
	    }
	  },
	  "_source": ["name","price"]
	}
  • ⑥分页(deep-paging):查询第一页(每页两条数据)
	GET /product/_search
	{
	  "query":{
	    "match_all": {}
	  },
	  "sort": [
	    {
	      "price": "asc"
	    }
	  ], 
	  "from": 0,
	  "size": 2
	}

(3)Full-text queries:全文检索

  • ①query-term:不会被分词,
	GET /product/_search
	{
	  "query": {
	    "term": {
	      "name": "nfc"
	    }
	  }
	}
  • ②match和term区别:
	GET /product/_search
	{
	  "query": {
	    "term": {
	      "name": "nfc phone" 这里因为没有分词,所以查询没有结果
	    }
	  }
	}
	GET /product/_search
	{
	  "query": {
	    "bool": {
	      "must": [
	        {"term":{"name":"nfc"}},
	        {"term":{"name":"phone"}}
	      ]
	    }
	  }
	}
	GET /product/_search
	{
	  "query": {
	    "terms": {
	      "name":["nfc","phone"]
	    }
	  }
	}
	GET /product/_search
	{
	  "query": {
	    "match": {
	      "name": "nfc phone" 
	    }
	  }
	}	
  • ☆全文检索
	GET /product/_search
	{
	  "query": {
	    "match": {
	      "name": "xiaomi nfc zhineng phone"
	    }
	  }
	}

验证分词

	GET /_analyze
	{
	  "analyzer": "standard",
	  "text":"xiaomi nfc zhineng phone"
	}
  • (4)Phrase search:短语搜索,和全文检索相反,“nfc phone”会作为一个短语去检索
	GET /product/_search
	{
	  "query": {
	    "match_phrase": {
	      "name": "nfc phone"
	    }
	  }
	}

(5)Query and filter:查询和过滤

  • ①bool:可以组合多个查询条件,bool查询也是采用more_matches_is_better的机制,因此满足must和should子句的文档将会合并起来计算分值。
    • 1)must:必须满足
      • 子句(查询)必须出现在匹配的文档中,并将有助于得分。
    • 2)filter:过滤器 不计算相关度分数,cache☆
      • 子句(查询)必须出现在匹配的文档中。但是不像 must查询的分数将被忽略。Filter子句在filter上下文中执行,这意味着计分被忽略,并且子句被考虑用于缓存。
    • 3)should:可能满足 or
      • 子句(查询)应出现在匹配的文档中。
    • 4)must_not:必须不满足 不计算相关度分数 not
      • 子句(查询)不得出现在匹配的文档中。子句在过滤器上下文中执行,这意味着计分被忽略,并且子句被视为用于缓存。由于忽略计分,0因此将返回所有文档的分数。
    • 5)minimum_should_match
  • ②案例:
	1)demo案例
	#首先筛选name包含“xiaomi phone”并且价格大于1999的数据(不排序),
	#然后搜索name包含“xiaomi”and desc 包含“shouji”
	
	GET /product/_search
	{
	  "query": {
	    "bool":{
	      "must": [
	        {"match": { "name": "xiaomi"}},
	        {"match": {"desc": "shouji"}}
	      ],
	      "filter": [
	        {"match_phrase":{"name":"xiaomi phone"}},
	        {"range": {
	          "price": {
	            "gt": 1999
	          }
	        }}
	      ]
	    }
	  }
	}
	2)bool多条件 name包含xiaomi 不包含erji 描述里包不包含nfc都可以,价钱要大于等于4999

	GET /product/_search
	{
	  "query": {
	"bool":{
	#name中必须不能包含“erji”
	      "must": [
	        {"match": { "name": "xiaomi"}}
	      ],
	#name中必须包含“xiaomi”
	      "must_not": [
	        {"match": { "name": "erji"}}
	      ],
	#should中至少满足0个条件,参见下面的minimum_should_match的解释
	      "should": [
	        {"match": {
	          "desc": "nfc"
	        }}
	      ], 
	#筛选价格大于4999的doc
	      "filter": [		
	        {"range": {
	          "price": {
	            "gt": 4999   
	          }
	        }}
	      ]
	    }
	  }
	}
  • ③嵌套查询:
    • 1)minimum_should_match:参数指定should返回的文档必须匹配的子句的数量或百分比。如果bool查询包含至少一个should子句,而没有must或 filter子句,则默认值为1。否则,默认值为0
	GET /product/_search
	{
	  "query": {
	    "bool":{
	      "must": [
	        {"match": { "name": "nfc"}}
	      ],
	      "should": [
	        {"range": {
	          "price": {"gt":1999}
	        }},
	         {"range": {
	          "price": {"gt":3999}
	        }}
	      ],
	      "minimum_should_match": 1
	    }
	  }
	}
	2)案例:
	GET /product/_search
	{
	  "query": {
	    "bool": {
	      "filter": {
	        "bool": {
	          "should": [
	            { "range": {"price": {"gt": 1999}}},
	            { "range": {"price": {"gt": 3999}}}
	          ],
	          "must": [
	            { "match": {"name": "nfc"}}
	          ]
	        }
	      }
	    }
	  }
	}
  • (6)Compound queries:组合查询
	①想要一台带NFC功能的 或者 小米的手机 但是不要耳机
	SELECT * from product 
	where (`name` like "%xiaomi%" or `name` like '%nfc%')
	AND `name` not LIKE '%erji%'
	GET /product/_search
	{
	  "query": {
	    "constant_score":{
	      "filter": {
	        "bool": {
	          "should":[
	            {"term":{"name":"xiaomi"}},
	            {"term":{"name":"nfc"}}
	            ],
	          "must_not":[
	            {"term":{"name":"erji"}}
	            ]
	        }
	      },
	      "boost": 1.2
	    }
	  }
	}
	②搜索一台xiaomi nfc phone或者一台满足 是一台手机 并且 价格小于等于2999
	SELECT * FROM product 
	WHERE NAME LIKE '%xiaomi nfc phone%' 
	OR (
	NAME LIKE '%erji%' 
	AND price > 399 
	AND price <=999);
	GET /product/_search
	{
	  "query": {
	    "constant_score": {
	      "filter": { 
	        "bool":{
	          "should":[
	            {"match_phrase":{"name":"xiaomi nfc phone"}},
	            {
	              "bool":{
	                "must":[
	                  {"term":{"name":"phone"}},
	                  {"range":{"price":{"lte":"2999"}}}
	                  ]
	              }
	            }
	          ]
	        }
	      }
	    }
	  }
	}
  • (7)Highlight search:
	GET /product/_search
	{
	    "query" : {
	        "match_phrase" : {
	            "name" : "nfc phone"
	        }
	    },
	    "highlight":{
	      "fields":{
	         "name":{}
	      }
	    }
	}

Deep paging图解

在这里插入图片描述

(1)解释:当你的数据超过1W,不要使用
(2)返回结果不要超过1000个,500以下为宜
(3)解决办法:
①尽量避免深度分页查询
②使用Scroll search(只能下一页,没办法上一页,不适合实时查询)

Scroll search:图解

(1)解决 deep paging问题

filter缓存原理:图解

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/333943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos7基于docker搭建gitlab mysql tomcat

STEP1 搭建gitlab$ sudo yum install docker-ce $ sudo systemctl start docker搜索Gitlab镜像 并拉取$ docker search gitlab $ docker pull beginor/gitlab-ce:11.0.1-ce.0 //选择自己要安装的版本在服务器本地创建需要映射的文件 etc&#xff08;配置&#xff09; data&…

网关服务限流熔断降级分布式事务

目录一、网关服务限流熔断降级二、Seata--分布式事务1、分布式事务基础①事务②本地事物③分布式事务④分布式事务的场景2、分布式事务解决方案①全局事务②最大努力通知③TCC事务3、Seata介绍4、Seata实现分布式事务控制①案例基本代码&#xff08;异常模拟&#xff09;②启动…

机器学习调参

机器学习调参常用调参方法举例K邻近算法&#xff08;最常规版本&#xff09;加入交叉验证加上网格搜索GridSearchCV函数介绍GridSearchCVcross_val_score常用调参方法举例 sklearn使得我们在很多编写代码的时候更多的工作倾向于调参数而不是去写算法本身&#xff0c;本篇文章整…

HTML表单(属性/元素/输入类型/输入属性):看这一篇就够了

HTML表单 HTML 表单用于搜集不同类型的用户输入。 <form> 元素 HTML 表单用于收集用户输入。 <form> 元素定义 HTML 表单&#xff1a; 实例 <form>form elements</form> HTML 表单包含表单元素。 表单元素指的是不同类型的 input 元素、复选框、单…

maven 命令指定配置文件打包springboot项目

再开发过程中&#xff0c;通常用工具集成了maven&#xff0c;很少直接用maven命令操作打包&#xff0c;记不住&#xff0c;麻烦有时候工具也出现问题&#xff0c;只能用命令行下面很有必要记录一下这个过程我这里用idea编辑器&#xff0c;项目原因 打包本地配置环境可以&#x…

Oracle MAA 参考架构

文章目录总览青铜青铜 MAA 参考架构青铜特性青铜停机时间总结白银白银 MAA 参考架构白银特性白银停机时间总结黄金黄金 MAA 参考架构远程备库多备库备库读取器农场跨区域远程同步备库黄金特性黄金停机时间总结白金白金 MAA 参考架构白金特性白金停机时间总结参考文档总览 图1 …

Springboot+vue+hadoop+java图书个性化推荐系统

前台首页功能模块 3.1首页 图书个性化推荐系统&#xff0c;在前台首页可以查看首页、图书信息、好书推荐、留言反馈、个人中心、后台管理等内容&#xff0c;如图 3.2图书信息 在图书信息页面通过查看图书编号、图书名称、图书类别、图片、作者、出版社、版次、数量、点击次数等…

python自学之《21天学通Python》(10)——正则表达式

第13章 正则表达式 最初的正则表达式出现于理论计算机科学的自动控制理论和形式化语言理论中。在这些领域中有对计算&#xff08;自动控制&#xff09;的模型和对形式化语言描述与分类的研究。 程序员所用的正则表达式是指用某种模式去匹配一类具有共同特征的字符串。正则表达…

ant-design V4升级V5记录(成功篇)

官方文档&#xff1a;https://ant.design/docs/react/migration-v5-cn 1、安装运行工具之前&#xff0c;提交本地修改内容&#xff1b; 2、工具运行完&#xff0c;根据提示修改文件问题&#xff1b; 3、移除config文件中module&#xff0c; [import,{libraryName:antd, libr…

负载均衡上传webshell+apache换行解析漏洞

目录一、负载均衡反向代理下的webshell上传1、nginx负载均衡2、负载均衡下webshell上传的四大难点难点一&#xff1a;需要在每一台节点的相同位置上传相同内容的webshell难点二&#xff1a;无法预测下一次请求是哪一台机器去执行难点三&#xff1a;当我们需要上传一些工具时&am…

Jenkins创建多分支流水线

Jenkins创建多分支流水线一、准备工作二、安装插件1、安装Docker和Docker Pipeline2、安装Blue Ocean3、安装Publish Over SSH三、创建多分支流水线四、配置以及脚本四、构建项目在我们的实际开发过程中&#xff0c;我们势必会存在多个分支进行不同的研发需要&#xff0c;这个时…

【LoRa 与 LoRaWAN】知识点汇总

本文主要记录【LoRa 与 LoRaWAN】知识点汇总&#xff0c;知识均来源于网络&#xff0c;纯属资料汇总与搬运 涉及到lora基本知识点&#xff0c;lora芯片的工作分析&#xff0c;专业名词解释 【LoRa 与 LoRaWAN】知识点汇总1.Lora和LoraWAN的区别2. lora 相关知识点汇总2.1 Lora调…

MG996R舵机介绍

舵机简介舵机是一种位置&#xff08;角度&#xff09;伺服的驱动器&#xff0c;适用于那些需要角度不断变化并可以保持的控制系统。在高档遥控玩具&#xff0c;如飞机、潜艇模型&#xff0c;遥控机器人中已经得到了普遍应用。舵机主要是由外壳、电路板、驱动马达、减速器与位置…

C语言入门教程||C语言 循环||C语言 函数

C语言 循环有的时候&#xff0c;可能需要多次执行同一块代码。一般情况下&#xff0c;语句是顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。编程语言提供了允许更为复杂的执行路径的多种控制结构。循环语句允许我们多次执…

蓝桥杯刷题021——填字母游戏(DFS)

2017国赛 题目描述 小明经常玩 LOL 游戏上瘾&#xff0c;一次他想挑战 K 大师&#xff0c;不料 K 大师说&#xff1a; "我们先来玩个空格填字母的游戏&#xff0c;要是你不能赢我&#xff0c;就再别玩 LOL 了"。 K 大师在纸上画了一行 n 个格子&#xff0c;要小明和…

go语言的并发编程

并发编程是 Go语言的一个重要特性,而 go语言也是基于此而设计出来的。 本文将会介绍如何使用go-gc中的“runtime”方法实现 go语言中的并发编程。 在之前的文章中,我们已经对 runtime方法进行了详细介绍,这次文章将对 runtime方法进行深入分析,并讲解如何在go-gc中使用该方…

Java NIO学习(二):Channel通道

2.1 Channel 概述Java NIO 的通道类似流&#xff0c;但又有些不同&#xff1a;既可以从通道中读取数据&#xff0c;又可以写数据到通道。但流的读写通常是单向的。通道可以异步地读写。通道中的数据总是要先读到一个 Buffer&#xff0c;或者总是要从一个 Buffer 中写入。2.2 Ch…

PrimoBurner SDK for .NET

PrimoBurner SDK for .NET PrimoBurnerSDK是一个CD、DVD和蓝光刻录工具开发工具包。PrimoBurner是跨平台的&#xff0c;它还提供了一个全面灵活的API&#xff0c;用于快速轻松地实现各种燃烧/翻录替代方案。现在PrimoBurner迫使许多卫生、国防、执法、娱乐和其他部门。 PrimoBu…

面试复习题--性能检测原理

1、布局性能检测 Systrace&#xff0c;内存优化工具中也用到了 Systrace,这里关注 Systrace 中的 Frames 页面&#xff0c;正常情况下圆点为绿色&#xff0c;当出现黄色或者红色的圆点时&#xff0c;表现出现了丢帧。 Layout Inspector&#xff0c;是 AndroidStudio 自带工具…

Python环境搭建、Idea整合

1、学python先要下载什么&#xff1f; 2、python官网 3、idea配置Python 4、idea新建python 学python先要下载什么&#xff1f; python是一种语言&#xff0c;首先你需要下载python&#xff0c;有了python环境&#xff0c;你才可以在你的电脑上使用python。现在大多使用的是pyt…