分布式搜索引擎ES-DSL搜索详解

1.DSL搜索-入门语法

建立索引: xxx(自定义名称)
自定义mapping:
POST /shop/_mapping

{"properties": {"id": {"type": "long"},"age": {"type": "integer"},"username": {"type": "keyword"},"nickname": {"type": "text","analyzer": "ik_max_word"},"money": {"type": "float"},"desc": {"type": "text","analyzer": "ik_max_word"},"sex": {"type": "byte"},"birthday": {"type": "date"},"face": {"type": "text","index": false}}
}

请求参数的查询(QueryString)
查询[字段]包含[内容]的文档
测试搜索:
GET /shop/_doc/_search?q=desc:新华网
拼接查询:称为queryString方式查询
GET /shop/_doc/_search?q=nickname:新&q=age:25

text与keyword搜索对比测试(keyword不会被倒排索引,不会被分词)

GET /shop/_doc/_search?q=nickname:super
GET /shop/_doc/_search?q=username:super
GET /shop/_doc/_search?q=username:super hero

这种方式称之为QueryString查询方式,参数都是放在url中作为请求参数的。

DSL基本语法
QueryString用的很少,一旦参数复杂就难以构建,所以大多查询都会使用dsl来进行查询更好。

Domain Specific Language
特定领域语言
基于JSON格式的数据查询
查询更灵活,有利于复杂查询
DSL格式语法:

查询

POST /shop/_doc/_search

{"query": {"match": {"desc": "新华网"}}
}

判断某个字段是否存在

{"query": {"exists": {"field": "desc"}}
}

语法格式为一个json object,内容都是key-value键值对,json可以嵌套。
key可以是一些es的关键字,也可以是某个field字段,后面会遇到
搜索不合法问题定位
DSL查询的时候经常会出现一些错误查询,出现这样的问题大多都是json无法被es解析,他会像java那样报一个异常信息,根据异常信息去推断问题所在,比如json格式不对,关键词不存在未注册等等,甚至有时候不能定位问题直接复制错误信息到百度一搜就能定位问题了。

2.DSL搜索-查询所有与分页

match_all
在索引中查询所有的文档

GET /shop/_doc/_search

POST /shop/_doc/_search

{"query": {"match_all": {}},"_source": ["id", "nickname", "age"]
}

可视化操作:
在这里插入图片描述

分页查询
默认查询是只有10条记录,可以通过分页来展示

POST /shop/_doc/_search

{"query": {"match_all": {}},"from": 0,"size": 10
}
{"query": {"match_all": {}},"_source": ["id","nickname","age"],"from": 5,"size": 5
}

Head可视化操作
在这里插入图片描述

3.DSL搜索-term与match

term精确搜索与match分词搜索
搜索的时候会把用户搜索内容,比如“中国强大”作为一整个关键词去搜索,而不会对其进行分词后再搜索

POST /shop/_doc/_search

{"query": {"term": {"desc": "新华网"}}
}

对比

{"query": {"match": {"desc": "新华网"}}
}

注:match会对新华网先进行分词(其实就是全文检索),在查询,而term则不会,直接把新华网作为一个整的词汇去搜索。
head 可视化操作对比:
在这里插入图片描述

terms 多个词语匹配检索
相当于是tag标签查询,可以完全匹配做类似标签的查询

POST /shop/_doc/_search

{"query": {"terms": {"desc": ["新华网", "学习", "骚年"]}}
}

4.其他常用语法

(1)match_phrase 短语匹配
match:分词后只要有匹配就返回,match_phrase:分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须都是连续的。(搜索比较严格)

slop:允许词语间跳过的数量

POST /shop/_doc/_search

{"query": {"match_phrase": {"desc": {"query": "大学 毕业 研究生","slop": 2}}}
}

(2)match 扩展
operator

or:搜索内容分词后,只要存在一个词语匹配就展示结果
and:搜索内容分词后,都要满足词语匹配
POST /shop/_doc/_search

{"query": {"match": {"desc": "新华网"}}
}

等同于

{"query": {"match": {"desc": {"query": "xbox游戏机","operator": "or"}}}
}

相当于 select * from shop where desc=‘xbox’ or|and desc=‘游戏机’

minimum_should_match: 最低匹配精度,至少有[分词后的词语个数]x百分百,得出一个数据值取整。举个例子:当前属性设置为70,若一个用户查询检索内容分词后有10个词语,那么匹配度按照 10x70%=7,则desc中至少需要有7个词语匹配,就展示;若分词后有8个,则 8x70%=5.6,则desc中至少需要有5个词语匹配,就展示。

minimum_should_match 也能设置具体的数字,表示个数

POST /shop/_doc/_search

{"query": {"match": {"desc": {"query": "好玩的xbox游戏机","minimum_should_match": "60%"}}}
}

根据文档主键ids搜索
GET /shop/_doc/1001

查询多个

POST /shop/_doc/_search

{"query": {"ids": {"type": "_doc","values": ["1001", "1010", "1008"]}}
}

(3)multi_macth/boost
multi_match
满足使用match在多个字段中进行查询的需求

POST /shop/_doc/_search

{"query": {"multi_match": {"query": "皮特帕克慕课网","fields": ["desc", "nickname"]}}
}

boost
权重,为某个字段设置权重,权重越高,文档相关性得分就越高。通畅来说搜索商品名称要比商品简介的权重更高。

POST /shop/_doc/_search

{"query": {"multi_match": {"query": "皮特帕克慕课网","fields": ["desc", "nickname^10"]}}
}

(4)布尔查询
可以组合多重查询

must:查询必须匹配搜索条件,譬如 and
should:查询匹配满足1个以上条件,譬如 or
must_not:不匹配搜索条件,一个都不要满足
实操1:

POST /shop/_doc/_search

{"query": {"bool": {"must": [{"multi_match": {"query": "新华网","fields": ["desc", "nickname"]}},{"term": {"sex": 1}},{"term": {"birthday": "1996-01-14"}}]}}
}{"query": {"bool": {"should(must_not)": [{"multi_match": {"query": "学习","fields": ["desc", "nickname"]}},{"match": {"desc": "游戏"}	},{"term": {"sex": 0}}]}}
}

实操2:

{"query": {"bool": {"must": [{"match": {"desc": "新"}	},{"match": {"nickname": "新"}	}],"should": [{"match": {"sex": "0"}	}],"must_not": [{"term": {"birthday": "1992-12-24"}	}]}}
}

为指定词语加权
特殊场景下,某些词语可以单独加权,这样可以排得更加靠前。

POST /shop/_doc/_search

{"query": {"bool": {"should": [{"match": {"desc": {"query": "律师","boost": 18}}},{"match": {"desc": {"query": "进修","boost": 2}}}]}}
}

(5)过滤器
对搜索出来的结果进行数据过滤。不会到es库里去搜,不会去计算文档的相关度分数,所以过滤的性能会比较高,过滤器可以和全文搜索结合在一起使用。
post_filter元素是一个顶层元素,只会对搜索结果进行过滤。不会计算数据的匹配度相关性分数,不会根据分数去排序,query则相反,会计算分数,也会按照分数去排序。
使用场景:

query:根据用户搜索条件检索匹配记录
post_filter:用于查询后,对结果数据的筛选
实操:查询账户金额大于80元,小于160元的用户。并且生日在1998-07-14的用户

gte:大于等于
lte:小于等于
gt:大于
lt:小于
(除此以外还能做其他的match等操作也行)
POST /shop/_doc/_search

{"query": {"match": {"desc": "新华网游戏"}	},"post_filter": {"range": {"money": {"gt": 60,"lt": 1000}}}	
}

(6)排序
es的排序同sql,可以desc也可以asc。也支持组合排序。

实操:

POST /shop/_doc/_search

{"query": {"match": {"desc": "新华网游戏"}},"post_filter": {"range": {"money": {"gt": 55.8,"lte": 155.8}}},"sort": [{"age": "desc"},{"money": "desc"}]
}

对文本排序
由于文本会被分词,所以往往要去做排序会报错,通常我们可以为这个字段增加额外的一个附属属性,类型为keyword,用于做排序。

创建新的索引
POST /shop2/_mapping

{"properties": {"id": {"type": "long"},"nickname": {"type": "text","analyzer": "ik_max_word","fields": {"keyword": {"type": "keyword"}}}}
}

插入数据
POST /shop2/_doc

{"id": 1001,"nickname": "美丽的风景"
}
{"id": 1002,"nickname": "漂亮的小哥哥"
}
{"id": 1003,"nickname": "飞翔的巨鹰"
}
{"id": 1004,"nickname": "完美的天空"
}
{"id": 1005,"nickname": "广阔的海域"
}

排序

{"sort": [{"nickname.keyword": "desc"}]
}

(7)高亮显示
高亮显示
POST /shop/_doc/_search

{"query": {"match": {"desc": "新华网"}},"highlight": {"pre_tags": ["<tag>"],"post_tags": ["</tag>"],"fields": {"desc": {}}}
}

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

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

相关文章

Springboot 多数据源事务

起因 在一个service方法上使用的事务,其中有方法是调用的多数据源orderDB 但是多数据源没有生效,而是使用的primaryDB 原因 spring 事务实现的方式 以 Transactional 注解为例 (也可以看 TransactionTemplate&#xff0c; 这个流程更简单一点)。 入口&#xff1a;ProxyTransa…

前端缓存策略

Service Worker &#xff08;https) 使用 Service Worker 可以实现离线功能和缓存策略&#xff0c;使你的 Web 应用在没有网络连接时也能正常运行。下面是一个详细的步骤和示例代码&#xff0c;展示如何使用 Service Worker 实现这一功能。 步骤 注册 Service Worker安装 Se…

PHP框架中的数据加密实践:确保数据安全的艺术

引言 数据加密是保护敏感信息不被未授权访问的关键技术。在PHP框架中实现数据加密不仅可以增强应用的安全性&#xff0c;也是遵守数据保护法规的必要措施。本文将深入探讨在PHP框架中实现数据加密的方法&#xff0c;包括加密算法的选择、密钥管理、以及如何在应用程序中集成加…

Java语言程序设计——篇九(1)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 内部类 概述内部类—内部类的分类成员内部类实战演练 局部内部类实战演练 匿名内部类实战演练 静态内部类实战演练 概述 内部类或嵌套类&#…

java pdf转base64图片工具类

java pdf转base64图片工具类 依赖工具类 依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.13</version></dependency>工具类 import org.apache.pdfbox.pdmodel.PDDocume…

组串式逆变器发展趋势

组串式逆变器单机功率不断增加 组串式逆变器的单体容量一般在100KW以下&#xff0c;在行业发展初期&#xff0c;一般以较小功率的组串式逆变器为主&#xff0c;随着功率模块等技术的不断发展&#xff0c;市场领先企业不断研发和推出单机功率较大的组串式逆变器。 随着单机功率的…

【攻防演练】【含poc和修复建议】海康威视综合安防管理平台 远程命令执行漏洞

使用防护类设备进行防护&#xff0c;限制访问/center/api/installation/detection 路径&#xff0c;拦截请求中出现的恶意命令注入 POST /center/api/installation/detection HTTP/1.1 Host: User-Agent: Mozilla/5.0 (Macintosh; Intel Mac Os X 10 12_6) AppleWebKit/537.36…

sheng的学习笔记-AI-公式-指数加权移动平均(EWMA)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 基础知识 指数加权移动平均&#xff08;Exponential Weighted Moving Average&#xff09;&#xff0c;是一种常用的序列处理方式 看例子&#xff0c;首先这是一年365天的温度散点图&#xff0c;以天数为横坐标&#xff0…

牛客AB5 | 点击消除

描述 牛牛拿到了一个字符串。 他每次“点击”&#xff0c;可以把字符串中相邻两个相同字母消除&#xff0c;例如&#xff0c;字符串"abbc"点击后可以生成"ac"。 但相同而不相邻、不相同的相邻字母都是不可以被消除的。 牛牛想把字符串变得尽可能短。他想知…

操作系统概念(黑皮书)阅读笔记

操作系统概念&#xff08;黑皮书&#xff09;阅读笔记 进程和内存管理部分章节 导论&#xff1a; 操作系统类似于政府&#xff0c;其本身不能实现任何有用功能&#xff0c;而是提供一个方便其他程序执行有用工作的环境 ​ 个人理解&#xff1a;os是government的作用&#xff0…

【学一点儿前端】本地或jenkins打包报错:getaddrinfo ENOTFOUND registry.nlark.com.

问题 今天jenkins打包一个项目&#xff0c;发现报错了 error An unexpected error occurred: "https://registry.nlark.com/xxxxxxxxxx.tgz: getaddrinfo ENOTFOUND registry.nlark.com". 先写解决方案 把yarn.lock文件里面的registry.nlark.com替换为registry.npmmi…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第五十八章 中断下文之tasklet

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

全球性“微软蓝屏”事件及其对网络安全和系统稳定性的深远影响

近日&#xff0c;一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅成为科技领域的热点新闻&#xff0c;更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件源于美国电脑安全技术公司“众击”提供的一个带有“缺陷”的软件更新&#xff0c;它如…

女人内裤怎么洗才是最干净?内衣裤洗衣机怎么样?哪个牌子更好?

最近刚好用到一款比较好用的洗内衣裤洗衣机&#xff01;如果你也和我一样有洗内衣裤烦恼的&#xff0c;或者可以看看&#xff01; 内衣裤作为贴身穿的衣服&#xff0c;我是不会把它和外衣一起清洗的&#xff0c;而家里面的大洗衣机已经担起了清洗外衣的工作&#xff01; 朋友们…

.NetCore定时刷新第三方Token

在.NET Core中实现定时刷新第三方Token的功能&#xff0c;你可以使用多种方法&#xff0c;包括使用System.Threading.Timer、IHostedService&#xff08;特别是用于ASP.NET Core应用&#xff09;&#xff0c;或者结合Quartz.NET等定时任务框架。以下我将介绍如何使用IHostedSer…

发票识别接口图片调用格式与python集成方式

企业员工在工作的过程中会接触到很多的发票&#xff0c;在报销前&#xff0c;需要将发票上的如发票代码、号码、日期、金额、校验码等全票面信息录入到报账系统中&#xff0c;如果一张一张手动去复制粘贴&#xff0c;将会耗费大量的人力、无力、时间成本&#xff0c;且人工手动…

JVM 内存分析工具 Memory Analyzer Tool(MAT)入门(一)

一、打开 jvisualvm &#xff08;VisualVM 是一款集成了 JDK 命令行工具和轻量级剖析功能的可视化工具。 设计用于开发和生产。&#xff09; 打开 jvisualvm.exe 工具会出现如下一些监控指标 二、VisualVM可以根据需要安装不同的插件&#xff0c;每个插件的关注点都不同&#x…

uniapp vue3 使用画布分享或者收藏功能

使用HBuilder X 开发小程序&#xff0c;大多数的画布插件很多都是vue2的写法&#xff0c;vue3的很少 我自己也试了很多个插件&#xff0c;但是有一些还是有问题&#xff0c;不好用 海报画板 - DCloud 插件市场 先将插件导入项目中 自己项目亲自用过&#xff0c;功能基本是完善…

谷粒商城-性能压测

1.压力测试 在项目上线前对其进行压力测试(以每个微服务为单元) 目的:找到系统能承载的最大负荷,找到其他测试方法更难发现的错误(两种类型:内存泄漏,并发与同步). 1.性能指标 响应时间(Response Time (RT)): 响应时间 指用户从客户端发起一个请求开始,到客户端接收到从服务…

python实现和mysql一起实现数据库的增删改查

要在 Python 中使用 MySQL 数据库进行增删改查&#xff08;CRUD&#xff09;操作&#xff0c;你可以使用 pymysql 库。以下是一些示例代码&#xff0c;展示如何实现这些操作。 首先&#xff0c;确保你已经安装了 pymysql。如果没有安装&#xff0c;可以通过以下命令安装&#…