ElasticSearch搜索引擎使用指南

一、ES数据基础类型

1、数据类型

字符串

主要包括: text和keyword两种类型,keyword代表精确值不会参与分词,text类型的字符串会参与分词处理

数值

包括: long, integer, short, byte, double, float

布尔值

boolean

时间

date

数组

数组类型不需要专门定义,只要插入的字段值是json数组就行

GEO类型

主要涉及地理信息检索、多边形区域的表达

2、text&keyword使用注意

text类型,支持全文搜索,因为text涉及分词,所以可以配置使用什么分词器,尤其涉及中文分词。

实际项目中,如果不需要模糊搜索的字符类型,可以选择keyword类型,例如:手机号、email、微信的openid等等,如果选text类型,可能会出现搜出一大堆相似的数据,而且不是精确的数据。

二、query语法

query子句主要用于编写查询条件,类似于SQL中的where语句。

query子句主要用于编写类似SQL的where语句,支持布尔查询(and/or)、IN、全文搜索、模糊匹配、范围查询(大于/小于)。

其中:text类型字段支持分词,可以使用模糊查询。keyword类型只能做等值查询,不能进行分词。

1、match类like匹配

1.1 match匹配单个字段

使用match实现全文搜索。类似于SQL中的like操作。

简单使用的语法:

GET /{索引名}/_search
{"query": {"match": {"{FIELD}": "{TEXT}"}}
}

说明:
{FIELD} - 就是我们需要匹配的字段名
{TEXT} - 就是我们需要匹配的内容

例子:

GET /article/_search
{"query": {"match" : {"title" : "ES教程"}}
}

article索引中,title字段匹配“ES教程”的所有文档。

如果title字段的数据类型是text类型,搜索关键词会进行分词处理。

等价SQL(假设"ES教程"没有进行分词):

select * from article where title like '%ES教程%'

1.2 multi_match多字段匹配

例子:

GET /article/_search
{"query": {"multi_match": {"query": "斯柯达前轮制动器","fields":["doc_title","doc_content"]}}
}

等价SQL:

select * from article where doc_title like '%<斯柯达前轮制动器的分词>%' or doc_content like '%<斯柯达前轮制动器的分词>%'

因为 斯柯达前轮制动器的分词 会有很多,所以实际上也会有很多的like,而不仅仅是上面的两个like。

1.3 multi_phrase顺序匹配

match_phrase查询是ES中一种用于精确匹配短语的查询方式,可以确保查询字符串中的关键词按照给定的顺序在文档中连续出现。

说明:检索词还是进行分词的,分词后的各个单词的顺序在 被检索的文中是一样的。

例子:

GET /article/_search
{"query": {"match_phrase": {"doc_content": "制动器装配"}}
}

搜索结果:

2、term精确匹配单个字段

使用term实现精确匹配

如果想要类似SQL语句中的等值匹配,不需要进行分词处理,例如:订单号、手机号、时间字段,不需要分值处理,只要精确匹配。

语法:

GET /{索引名}/_search
{"query": {"term": {"{FIELD}": "{VALUE}"}}
}

{FIELD} - 就是我们需要匹配的字段名
{VALUE} - 就是我们需要匹配的内容,除了TEXT类型字段以外的任意类型

例子:

GET /order_v2/_search
{"query": {"term": {"order_no": "202003131209120999"}}
}

搜索订单号order_no = "202003131209120999"的文档。

类似SQL语句:

select * from order_v2 where order_no = "202003131209120999"

3、terms实现SQL的in语句

如果我们要实现SQL中的in语句,一个字段包含给定数组中的任意一个值就匹配。

语法:

GET /order_v2/_search
{"query": {"terms": {"{FIELD}": ["{VALUE1}","{VALUE2}"]}}
}

说明:

{FIELD} - 就是我们需要匹配的字段名
{VALUE1}, {VALUE2} … {VALUE N} - 就是我们需要匹配的内容,除了TEXT类型字段以外的任意类型。

例子:

GET /order_v2/_search
{"query": {"terms": {"shop_id": [123,100,300]}}
}

搜索order_v2索引中,shop_id字段,只要包含[123,100,300]其中一个值,就算匹配。

类似SQL语句:

select * from order_v2 where shop_id in (123,100,300)

4、range范围查询

通过range实现范围查询,类似SQL语句中的>, >=, <, <=表达式。

语法:

GET /{索引名}/_search
{"query": {"range": {"{FIELD}": {"gte": 10, "lte": 20}}}
}

参数说明:

{FIELD} - 字段名

gte范围参数 - 等价于>=

lte范围参数 - 等价于 <=

范围参数可以只写一个,例如:仅保留 “gte”: 10, 则代表 FIELD字段 >= 10

范围参数如下:

gt - 大于 ( > )
gte - 大于且等于 ( >= )
lt - 小于 ( < )
lte - 小于且等于 ( <= )

例子:

GET /order_v2/_search
{"query": {"range": {"shop_id": {"gte": 10,"lte": 200}}}
}

查询order_v2索引中,shop_id >= 10 且 shop_id <= 200的文档。类似SQL:

select * from order_v2 where shop_id >= 10 and shop_id <= 200

5、bool组合查询

前面的例子都是设置单个字段的查询条件,如果想要编写类似SQL的Where语句组合多个字段的查询条件,可以使用bool语句。

5.1 bool查询基本语法结构

语法:

GET /{索引名}/_search
{"query": {"bool": { // bool查询"must": [], // must条件,类似SQL中的and, 代表必须匹配条件"must_not": [], // must_not条件,跟must相反,必须不匹配条件"should": [] // should条件,类似SQL中or, 代表匹配其中一个条件}}
}

must、must_not和should条件的参数都是一个数组,意味着他们都支持设置多个条件。

同时,前面介绍的单个字段的匹配语句,都可以用在bool查询语句中进行组合。

5.2 must条件

类似SQL的and,代表必须匹配的条件。

语法:

GET /{索引名}/_search
{"query": {"bool": {"must": [{匹配条件1},{匹配条件2},...可以有N个匹配条件...]}}
}

例子:

GET /order_v2/_search
{"query": {"bool": {"must": [{"term": {"order_no":  "202003131209120999"}},{"term": {"shop_id":  123}}]}}
}

这里的Must条件,使用了term精确匹配,等价SQL:

select * from order_v2 where order_no="202003131209120999" and shop_id=123

5.3 must_not条件

跟must的作用相反,语法类似。

5.4 should条件

类似SQL中的 or, 只要匹配其中一个条件即可。

语法:

GET /{索引名}/_search{"query": {"bool": {"should": [{匹配条件1},{匹配条件2},…可以有N个匹配条件…]}}}

例子:

GET /order_v2/_search
{"query": {"bool": {"should": [{"term": {"order_no": "202003131209120999"}},{"term": {"order_no": "22222222222222222"}}]}}
}

等价SQL:

select * from order_v2 where order_no="202003131209120999" or order_no="22222222222222222"

5.5 bool综合例子

GET /order_v2/_search
{"query": {"bool": {"should": [{"bool": {"must": [{"term": {"order_no": "2020031312091209991"}},{"range": {"shop_id": {"gte": 10,"lte": 200}}}]}},{"terms": {"tag": [1,2,3,4,5,12]}}]}}
}

等价SQL:

select * from order_v2 where (order_no='202003131209120999' and (shop_id>=10 and shop_id<=200)) or tag in (1,2,3,4,5)

6、wildcard通配符查询

wildcard 关键字: 通配符查询 ? 用来匹配一个任意字符 * 用来匹配多个任意字符。

例子:

GET /xizi/emp/_search{"query": {"wildcard": {"name": {"value": "xi*"}}}}

7、fuzzy模糊查询

fuzzy 模糊查询,最大模糊错误必须在0-2之间  

搜索关键词长度为 2 不允许存在模糊 0

 搜索关键词长度为3-5 允许一次模糊 0 1  

搜索关键词长度大于5 允许最大2模糊

例子:

GET /xizi/emp/_search{"query": {"fuzzy": {"name":"xizi"}}}

8、额外限制条件

8.1 _source指定返回字段

例子1:

get lib3/user/_search
{"_source":["name","age"],"query":{"match": {"interests": "changge"}}

结果只返回索引中name和age字段信息

例子2:

get lib3/user/_search
{"query":{"match_all": {}},"_source":{"includes": "addr*","excludes": ["name","bir*"]}
}

显示要的字段、去除不需要的字段、可以使用通配符*。

8.2 boost查询的权重

8.3 min_similarity设置匹配的最小相似度

8.4 highlight高亮搜索结果

例子:

get data_info/_search
{"_source":["doc_title","doc_content"],"query": {"match": {"doc_content": "斯柯达前轮制动器"}},"highlight":{"fields":{"doc_content":{}}}
}

返回结果:

8.5 size指定返回条数

ES默认返回10条结果。

例子:

get data_info/_search
{"query": {"match": {"doc_content": "斯柯达前轮制动器"}},"size": 2
}

结果中只有2条信息。

8.6 from分页查询

from 关键字: 用来指定起始返回位置,和size关键字连用可实现分页效果。

例子:

get data_info/_search
{"query": {"match": {"doc_content": "斯柯达前轮制动器"}},"size": 2,"from": 3
}

8.7 指定字段排序sort

使用该属性会让得分失效

例子:

GET /db_idx4/_search
{"query":{"match_all":{}},"sort":[{"age":"desc"}]
}

三、全文搜索

1、概念

平时我们使用SQL like语句搜索一些文本、字符串是否包含指定的关键词,如果两篇文章都包含我们的关键词,那么具体哪篇文章内容的相关度更高?这个SQL的like语句是做不到的,更别说like语句的性能问题了。

ES通过分词、相关度计算可以解决这个问题,ES内置了一些相关度算法,大致上意思是:如果一个关键词在一篇文章出现的频率高,并且在其他文章中出现少,那说明这个关键词与这篇文章的相关度很高。

ES对于text类型的字段,在插入数据的时候,会进行分词处理,然后根据分词的结果索引文档,当我们搜索text类型字段的时候,也会先对搜索关键词进行分词处理、然后根据分词的结果去搜索。

2、分词效果测试

语法:

GET /_analyze
{"text": "需要分词的内容","analyzer": "分词器"
}

例子:

GET http://xx.elasticsearch.aliyuncs.com:9200/_analyze
{"text":"上海大学","analyzer": "standard"
}

使用standard分词器,对"上海大学"进行分词,下面是输出结果:

{"tokens": [{"token": "上","start_offset": 0,"end_offset": 1,"type": "<IDEOGRAPHIC>","position": 0},{"token": "海","start_offset": 1,"end_offset": 2,"type": "<IDEOGRAPHIC>","position": 1},{"token": "大","start_offset": 2,"end_offset": 3,"type": "<IDEOGRAPHIC>","position": 2},{"token": "学","start_offset": 3,"end_offset": 4,"type": "<IDEOGRAPHIC>","position": 3}]
}

token就是分解出来的关键词。

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

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

相关文章

基于ssm学生公寓管理系统的设计与开发论文

学生公寓管理系统的设计与实现 摘要 如今&#xff0c;科学技术的力量越来越强大&#xff0c;通过结合较为成熟的计算机技术&#xff0c;促进了学校、医疗、商城等许多行业领域的发展。为了顺应时代的变化&#xff0c;各行业结合互联网、人工智能等技术&#xff0c;纷纷开展了…

P1160 队列安排题解

题目 一个学校里老师要将班上N个同学排成一列&#xff0c;同学被编号为1∼N&#xff0c;他采取如下的方法&#xff1a; 先将1号同学安排进队列&#xff0c;这时队列中只有他一个人&#xff1b; 2∼N号同学依次入列&#xff0c;编号为i的同学入列方式为&#xff1a;老师指定编…

下载huggingface数据集到本地并读取.arrow文件遇到的问题

文章目录 1. 524MB中文维基百科语料&#xff08;需要下载的数据集&#xff09;2. 下载 hugging face 网站上的数据集3. 读取 .arrow 文件报错代码4. 纠正后代码 1. 524MB中文维基百科语料&#xff08;需要下载的数据集&#xff09; 2. 下载 hugging face 网站上的数据集 要将H…

MATLAB环境下一种新颖的类脉冲信号的高分辨率时频分析方法

一般情况下&#xff0c;机械振动信号或地震信号是非平稳的。而传统傅立叶变换只能应用于平稳信号分析&#xff0c;故不适用于非平稳信号。所以&#xff0c;我们需要采用时频分析方法。时频分析方法能达到同时在时间域和频率域对信号进行分析的目的&#xff0c;得到信号在不同时…

Python爬取网站视频资源

思路&#xff1a; 在界面找到视频对应的html元素位置&#xff0c;观察发现视频的url为https://www.pearvideo.com/video_视频的id&#xff0c;而这个id在html中的href中&#xff0c;所以第一步需要通过xpath捕获到所需要的id 在https://www.pearvideo.com/video_id的页面&…

线程池学习

github看到一个项目&#xff08;GitHub - markparticle/WebServer: C Linux WebServer服务器&#xff09;&#xff0c;内部使用的一个线程池看着不错&#xff0c;拿来学习一下。 /** Author : mark* Date : 2020-06-15* copyleft Apache 2.0*/ #ifndef THREADPO…

Windows系统搭建VisualSVN并结合内网穿透实现远程访问本地服务

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

Spring 事务常见错误(上)

通过上一章的学习&#xff0c;我们了解了 Spring Data 操作数据库的一些常见问题。这一章我们聊一聊数据库操作中的一个非常重要的话题——事务管理。 Spring 事务管理包含两种配置方式&#xff0c;第一种是使用 XML 进行模糊匹配&#xff0c;绑定事务管理&#xff1b;第二种是…

洗澡、泡脚真的能养生? 皮肤科医生来科普

现如今人们越来越注重健康与养生&#xff0c;除了枸杞、生姜等食补外&#xff0c;各种保健方法和保健产品也层出不穷&#xff0c;还有泡脚、洗凉水澡等养生延缓衰老的方式也广泛流行&#xff0c;那么泡脚与洗凉水澡真的有用吗?西安国际医学中心医院皮肤科主任高鹏程特意进行了…

Timeplus-proton流处理器调研

概念 Timeplus是一个流处理器。它提供强大的端到端功能&#xff0c;利用开源流引擎Proton来帮助数据团队快速直观地处理流数据和历史数据&#xff0c;可供各种规模和行业的组织使用。它使数据工程师和平台工程师能够使用 SQL 释放流数据价值。 Timeplus 控制台可以轻松连接到不…

女性三八节礼物攻略:她无法抗拒的五大礼物

随着春风的温柔拂面&#xff0c;我们即将迎来一年一度的三八国际妇女节。这个特别的日子&#xff0c;不仅是对女性贡献的认可和庆祝&#xff0c;也是向我们生命中的女性表达感激和爱意的绝佳时机。在这个充满温馨和敬意的时刻&#xff0c;我们常常在思考&#xff0c;如何用一份…

elementUI el-table中的对齐问题

用elementUI时&#xff0c;遇到了一个无法对齐的问题&#xff1a;代码如下&#xff1a; <el-table :data"form.dataList" <el-table-column label"验收结论" prop"checkResult" width"200"> <template slot-sco…

揭秘!Excel如何成为职场中的价值创造利器

文章目录 一、Excel在生产力提升中的作用二、Excel在创造价值方面的应用案例三、Excel实用技巧分享四、Excel与其他工具的协同应用五、Excel学习的建议与展望《Excel函数与公式应用大全》亮点内容简介作者简介目录 在当今信息爆炸的时代&#xff0c;数据处理和分析能力已成为职…

AI智能分析网关V4智慧商场方案,打造智慧化商业管理生态

AI智能视频检测技术在商场楼宇管理中的应用越来越广泛。通过实时监控、自动识别异常事件和智能预警&#xff0c;这项技术为商场管理提供了更高效、更安全的保障。今天我们以TSINGSEE青犀视频AI智能分析网关为例&#xff0c;给大家介绍一下AI视频智能分析技术如何应用在商场楼宇…

抢单情况下的均衡分配机制

背景&#xff1a; 1、工单有多种类型。 2、客户提交工单。 3、不同客服受理不同类型工单&#xff0c;受理工单类型存在交叉。 4、按照类型维度实现均衡分配。 方案&#xff1a; 1、为每种类型创建一个工单池&#xff0c;使用队列&#xff0c;左进右出&#xff1b;客户提交…

将所有字母转化为该字母后的第三个字母,即A->D,B->E

//编写加密程序&#xff0c;规则&#xff1a;将所有字母转化为该字母后的第三个字母&#xff0c;即A->D,B->E,C->F,…Y->B,Z->C //小写字母同上&#xff0c;其他字符不做转化。输入&#xff1a;I love 007 输出&#xff1a;L oryh 007 代码&#xff1a; #inc…

配置MMDetection的solov2攻略整理

目录 一、MMDetection 特性 常见用法 二、ubuntu20.04配置solov2 三、Windows11配置solov2 一、MMDetection MMDetection是一个用于目标检测的开源框架&#xff0c;由OpenMMLab开发和维护。它提供了丰富的预训练模型和模块&#xff0c;可以用于各种目标检测任务&#xff…

redis的基本数据类型(一)

redis的基本数据类型 1、redis1.1、数据库分类1.2、NoSQL分类1.3、redis简介1.4、redis应用1.5、如何学习redis 2、redis的安装2.1、Windows安装2.2.1、客户端redis管理工具 2.2、Linux安装&#x1f525;2.2.1、redis核心文件2.2.2、启动方式2.2.3、redis桌面客户端1、redis命令…

Python进阶学习:Pickle模块--dump()和load()的用法

Python进阶学习&#xff1a;Pickle模块–dump()和load()的用法 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您…

ASO 对App产品性能的影响

可发现性 拥有出色的App还不足以让人们发现它&#xff0c;ASO技术通过提高搜索排名来增强App的可发现性。当用户可以在搜索结果中轻松找到应用程序时&#xff0c;那么下载和成功的潜力就会飙升。 设定期望 实施有效的应用商店优化不仅可以为潜在用户建立正确的期望&#xf…