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": "制动器装配"}}
}

搜索结果:

1.4 operator的布尔操作 

指定分词匹配的布尔规则,默认情况下operator为or,即分词中有一个匹配即可。

当operator为and时,需要文档匹配所有的分词。

例子:

GET demo_idx/_search
{"query": {"match": {"content": {"query": "simple rest apis distributed nature","operator": "and"}}}
}

1.5 结合operator、boost及match_phrase的查询

我们希望精确匹配在搜索结果中排名较高,但也希望看到结果中相关性较低的文档,此时使用should子句来组合OR、AND和match短语查询。布尔查询中的should子句采用更好匹配的方法,因此每个子句的得分将为每个文档的最终_score做出贡献。

GET demo_idx/_search
{"query": {"bool": {"should": [{"match": {"content": {"query": "simple rest apis distributed nature"}}},{"match": {"content": {"query": "simple rest apis distributed nature","operator": "and"}}},{"match_phrase": {"content": {"query": "simple rest apis distributed nature","boost": 2}}}]}}
}

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查询的权重

boost值控制每个查询子句的相对权重,该值默认为1。

boost参数被用来增加一个子句的相对权重(当boost大于1时),或者减小相对权重(当boost介于0到1时),但是增加或者减小不是线性的。换言之,boost设为2并不会让最终的_score加倍。

例子:

GET/_search{"query": {"bool": {"must": {"match": {"content": {"query": "full text search","operator": "and"}}},"should": [{"match": {"content": {"query": "Elasticsearch","boost": 3}}},{"match": {"content": {"query": "Lucene","boost": 2}}}]}}
}

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"}]
}

8.8 explain查看分数计算详情

ES提供了一个解释性API和一个解释性查询参数以了解如何计算分数。

例子:

GET /db_idx4/_search
{"explain": true,"query": {"match_phrase": {"doc_content": "制动器装配"}}
}

结果示例:

三、全文搜索

1、概念

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

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

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

2、文档评分计算

2.1 默认评分影响因素

ES使用的默认评分算法是BM25,决定文档得分的3个主要因素:

  • 字词频率(TF):搜索字词在我们正在搜索的文档中的字段中出现的次数越多,则该文档越相关
  • 反向文档频率(IDF):在我们要搜索的字段中包含搜索词的文档越多,该词的重要性就越低
  • 字段长度:如果文档在非常短的字段(即,只有几个单词)中包含搜索词,则比文档在较长的字段(即,包含很多单词)中包含搜索词更相关

2.2 使用function_score和script_score定制搜索结果分数

function_score和script_score是很耗资源的,所以实际使用时只需要计算一组经过过滤的文档的分数。

script_score定制的例子:

GET best_games/_search
{"_source": ["name","critic_score","user_score"],"query": {"script_score": {"query": {"match": {"name": "Final Fantasy"}},"script": {"source": "_score * (doc['user_score'].value*10+doc['critic_score'].value)/2/100"}}}
}

具体细节参考:Elasticsearch:使用 function_score 及 script_score 定制搜索结果的分数-CSDN博客

 

3、分词效果测试

语法:

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就是分解出来的关键词。

四、难点剖析

1、filter与must的区别

同样是按条件匹配,filter不统计相关度,must统计相关度。就是filter不计算score分数值,而must是计算的。所以must比filter计算更复杂、更耗时。

具体参考:Elasticsearch Query: filter与must的区别_elasticsearch must 和filter的区别-CSDN博客

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

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

相关文章

独立游戏《星尘异变》UE5 C++程序开发日志1——项目与代码管理

写在前面&#xff1a;本日志系列将会向大家介绍在《星尘异变》这款模拟经营游戏&#xff0c;在开发时用到的与C相关的泛用代码与算法&#xff0c;主要记录UE5C与原生C的用法区别&#xff0c;以及遇到的问题和解决办法&#xff0c;因为这是我本人从ACM退役以后第一个从头开始的项…

【数据结构】知识点一:线性表之顺序表

内容导航 一、什么是线性表&#xff1f;二、什么是顺序表&#xff1f;1、顺序表的概念2、顺序表的结构a. 静态顺序表&#xff1a;使用定长数组存储元素。b. 动态顺序表&#xff1a;使用动态开辟的数组存储。 三、顺序表的接口实现精讲1.接口一&#xff1a;打印数据2.接口二&…

持安科技亮相张江高科895创业营,总评分第三名荣获「最具创新性企业」!

近日&#xff0c;张江高科895创业营&#xff08;第十三季&#xff09;信息安全专场Demo day&结营仪式在上海集成电路设计产业园圆满落幕。本季创业营通过多种渠道在海内外甄选优秀创业项目&#xff0c;一共择优录取了29家入营&#xff0c;最终甄选出9家代表参加Demo day路演…

Django后端开发——中间件

文章目录 参考资料中间件注册中间件settings.pymiddleware/mymiddleware.pymysite3/views.pymysite3/urls.py 练习 参考资料 B站网课&#xff1a;点击蓝色字体跳转 或复制链接至浏览器&#xff1a;https://www.bilibili.com/video/BV1vK4y1o7jH?p39&vd_source597e21cf34f…

数据可视化原理-腾讯-热力图

在做数据分析类的产品功能设计时&#xff0c;经常用到可视化方式&#xff0c;挖掘数据价值&#xff0c;表达数据的内在规律与特征展示给客户。 可是作为一个产品经理&#xff0c;&#xff08;1&#xff09;如果不能够掌握各类可视化图形的含义&#xff0c;就不知道哪类数据该用…

Mybatis plus扩展功能-Db静态工具

目录 1 前言 2 使用方法 2.1 Db静态工具拥有的部分方法 2.2 举例 1 前言 在我们的服务层中&#xff0c;有时为了实现一个方法需要引入其它的Mapper层方法&#xff0c;但是&#xff0c;这样可能出现循环依赖。虽然Spring已经给我们解决了简单的循环依赖问题&#xff0c;但是…

深入剖析k8s-Pod篇

为什么需要Pod&#xff1f; 进程是以进程组的方式组织在一起。受限制容器的“单进程模型”&#xff0c; 成组调用没有被妥善处理&#xff08;资源调用有限&#xff09;&#xff0c;使用资源囤积则导致复杂度上升。 在k8s项目中&#xff0c;Pod的实现需要使用一个中间容器——…

web组态(BY组态)接入流程

技术文档 官网网站&#xff1a;www.hcy-soft.com 体验地址&#xff1a; www.byzt.net:60/sm 一、数据流向图及嵌入原理 数据流向 嵌入原理 二、编辑器调用业务流程图 三、集成前需要了解的 1、后台Websocket端往前台监控画面端传输数据规则 后台websocket向客户端监控画面…

基于CNN-LSTM-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 长短时记忆网络&#xff08;LSTM&#xff09;处理序列依赖关系 4.3 注意力机制&#xff08;Attention&#xff09; 5…

python自动化之项目架构搭建与思路讲解(第二天)

1.自动化测试的概念 自动化测试是指使用自动化工具和脚本来执行测试任务&#xff0c;以验证软件或系统的正确性和稳定性。它可以提高测试的效率和准确性&#xff0c;并节约时间和成本。 2.自动化脚本编写的思路 xmind文档如有需要&#xff0c;可在资源里自行下载 3.项目代码…

MySQL NDB Cluster 分布式架构搭建 自定义启动与重启Shell脚本

此次NDB Cluster使用三台虚拟机进行搭建&#xff0c;一台作为管理节点&#xff1b;而对于另外两台服务器&#xff0c;每一台都充当着数据节点和SQL节点的角色。注意不是MGR主从复制架构&#xff0c;而是分布式MySQL架构。 创建 /var/lib/mysql-cluster/config.ini Cluster全局…

(面试题)数据结构:链表相交

问题&#xff1a;有两个链表&#xff0c;如何判断是否相交&#xff0c;若相交&#xff0c;找出相交的起始节点 一、介绍 链表相交&#xff1a; 若两个链表相交&#xff0c;则两个链表有共同的节点&#xff0c;那从这个节点之后&#xff0c;后面的节点都会重叠&#xff0c;知道…

灯塔:CSS笔记

CSS&#xff1a;层叠样式表 所谓层叠 即叠加的意思&#xff0c;表示样式可以一层一层的层叠覆盖 css写在style标签中&#xff0c;style标签一般写在head标签里面&#xff0c;title标签下面 <!DOCTYPE html> <html lang"en"> <head><meta cha…

Vue开发实例(一)Vue环境搭建第一个项目

Vue环境搭建&第一个项目 一、环境搭建二、安装Vue脚手架三、创建Vue项目 一、环境搭建 下载方式从官网下载&#xff1a;http://nodejs.cn/download/ 建议下载v12.16.0版本以上的&#xff0c;因为版本低无法创建Vue的脚手架 检验是否安装成功 配置环境变量 新增NODE_HOME&…

chrome选项页面options page配置

options 页面用以定制Chrome浏览器扩展程序的运行参数。 通过Chrome 浏览器的“工具 ->更多工具->扩展程序”&#xff0c;打开chrome://extensions页面&#xff0c;可以看到有的Google Chrome扩展程序有“选项Options”链接&#xff0c;如下图所示。单击“选项Options”…

车载测试_UDS诊断:功能寻址、物理寻址

车载项目讲解 简历修改优化 模拟面试 面试录音辅导 预约面试技巧 面试一对一在线协助 车载入职技术支持三个月 诊断三要素&#xff1a;请求/肯定响应/否定响应&#xff08;诊断服务失败或者无法完成&#xff09;。 服务可以诊断通信管理请求、数据请求、故障代码请求、输入/输出…

SpringBoot约定大于配置

什么是约定大于配置 "约定大于配置"&#xff08;Convention Over Configuration&#xff09;是一种理念&#xff0c;旨在通过默认约定和规则来减少开发人员需要做的配置工作。在Spring Boot框架中&#xff0c;这一原则得到了充分应用&#xff0c;帮助开发者更快地构…

使用Spark探索数据

需求分析 使用Spark来探索数据是一种高效处理大规模数据的方法&#xff0c;需要对数据进行加载、清洗和转换&#xff0c;选择合适的Spark组件进行数据处理和分析。需求分析包括确定数据分析的目的和问题、选择合适的Spark应用程序和算法、优化数据处理流程和性能、可视化和解释…

(三)softmax分类--九五小庞

softmax分类 对数几率回归解决的是二分类的问题&#xff0c;对于多个选项的问题&#xff0c;我们可以使用softmax函数&#xff0c;它是对数几率回归在N个可能不同的值上的推广 softmax各样本分量之和为1&#xff0c;当只有两个类别时&#xff0c;与对数几率回归完全相同 损失…

vmware虚拟机centos中/dev/cl_server8/root 空间不够

在使用vmware时发现自己的虚拟机的/dev/cl_server8/root空间不够了&#xff0c;没办法安装新的服务。所以查了一下改空间的办法。 1.在虚拟机关闭的状态下&#xff0c;选中需要扩容的虚拟机->设置->硬件-> 硬盘->扩展->填写扩大到的值。 2.打开虚拟机&#xff…