es 3期 第14节-全文文本分词查询

#### 1.Elasticsearch是数据库,不是普通的Java应用程序,传统数据库需要的硬件资源同样需要,提升性能最有效的就是升级硬件。
#### 2.Elasticsearch是文档型数据库,不是关系型数据库,不具备严格的ACID事务特性,任何企图直接替代严格事务性场景的应用项目都会失败!!!

##### 索引字段与属性都属于静态设置,若后期变更历史数据需要重建索引才可生效
##### 对历史数据无效!!!!
##### 一定要重建索引!!!

#### 全文文本概念
### 概念介绍
## 1.文章语句分词
## 2.分词之后,支持基于分词检索
## 3.分词算法很多,分词领域很深入
## 4.基于倒排索引算法-Inverted-Index
## 5.分词检索的打分算法TF/IDF=>BM25
## 6.字段类型仅限于text类型

## 全文搜索内容较深,初步学习使用即可

# es测试分词器默认api语法,默认分词算法 standard 按照空格、逗号这种方式分
# 初步理解分词,数据在入库前已经做好了分词并建立了索引

POST _analyze
{"text": ["hello every body, 我是DavidSoCool, 我正在学习es"],"analyzer":"standard"
}

### 全文文本检索
# Match-all:全查询
# Match:标准分词

# 准备数据

DELETE kibana_sample_data_flights_fulltext
POST _reindex
{"source": {"index": "kibana_sample_data_flights"},"dest": {"index": "kibana_sample_data_flights_fulltext"}
}

## match-all 全匹配
# 1.Match all没有限制条件,直接等同于search查询
# 2.boost:可以调整加权数值

GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match_all": {"boost": 10}}
}

## match_none,反向全匹配,可用于测试索引健康,不同与查询数据消耗性能

GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match_none": {}}
}

## match,文本匹配,最常用的
# 排序默认根据_score分值,匹配的次越多,分值就越高,可以用于做简单的推荐系统

GET kibana_sample_data_flights_fulltext/_mapping
# 先测试下分词结果,分成了4个词
POST _analyze
{"text": ["Cape Town International Airport"],"analyzer":"standard"
}
# 任意匹配一个词就能查询出来
GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match": {"Origin":"Cape Town International Airport"}}
}
# 看5000条以后_score分值和Origin字段匹配的数量
GET kibana_sample_data_flights_fulltext/_search
{"from":1000,"track_total_hits": true,"query":{"match": {"Origin":"Cape Town International Airport"}}
}
# 看9000条以后_score分值和Origin字段匹配的数量
GET kibana_sample_data_flights_fulltext/_search
{"from":9000,"track_total_hits": true,"query":{"match": {"Origin":"Cape Town International Airport"}}
}

## Request 请求参数
# query:查询表达式
# analyzer:指定分词器,对于查询输入的文本进行分词
# operator:分词之间关联关系,默认是or
# minimum_should_match:分词最小匹配数量

# 这条语句等价于下面那条
GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match": {"Origin":{"query": "Cape Town International Airport","analyzer": "standard","operator": "or"}}}
}
# 这条语句等价于上面那条
GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match": {"Origin":"Cape Town International Airport"}}
}
# 使用operator=and,表示所有词都匹配上,注意看total
GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match": {"Origin":{"query": "Cape Town International Airport","analyzer": "standard","operator": "and"}}}
}
# 去掉前两个词后,跳过100条看看
GET kibana_sample_data_flights_fulltext/_search
{"from": 100,"track_total_hits": true,"query":{"match": {"Origin":{"query": "International Airport","analyzer": "standard","operator": "and"}}}
}
# minimum_should_match,控制匹配词的精确度,可以使用数字和百分比
# 只能用or,and会查不出数据
GET kibana_sample_data_flights_fulltext/_search
{"from": 100,"track_total_hits": true,"query":{"match": {"Origin":{"query": "Cape Town International Airport","analyzer": "standard","operator": "or","minimum_should_match": 2}}}
}
# 跳过数据看看,total总数111条,跳过110条
# 第111条还是全匹配数据,112开始就只有2个词匹配的数据了
GET kibana_sample_data_flights_fulltext/_search
{"from": 110,"track_total_hits": true,"query":{"match": {"Origin":{"query": "Cape Town International Airport","analyzer": "standard","operator": "or","minimum_should_match": 2}}}
}
# 如何minimum_should_match=4就相当于使用and的了
GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match": {"Origin":{"query": "Cape Town International Airport","analyzer": "standard","operator": "or","minimum_should_match": 4}}}
}
# minimum_should_match 使用百分比,这里不是简单看分词的比例,需要看文档理解
# 建议还是使用数字,如果词很多可以使用百分比
GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match": {"Origin":{"query": "Cape Town International Airport","analyzer": "standard","operator": "or","minimum_should_match": "50%"}}}
}
# minimum_should_match 也可以使用负数,相当于是负相关,不建议使用
GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match": {"Origin":{"query": "Cape Town International Airport","analyzer": "standard","operator": "or","minimum_should_match": -1}}}
}
# fuzziness 纠错搜索,可以帮助我们纠正输入错误的词,具体看文档
# 将Cape输入成错误的Capa
GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match": {"Origin":{"query": "Capa","analyzer": "standard","operator": "or","fuzziness": 1}}}
}

## Match boolPrefix前缀匹配
# 集成了match和bool
# 去掉最后的Airport,并且把International最后的l去掉,相当于前面2个单词全匹配,最后一个Internationa使用的前缀匹配

GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match_bool_prefix": {"Origin":"Cape Town Internationa"}}
}
# 原语句
GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match": {"Origin":"Cape Town International Airport"}}
}

## match_phrase 短语搜索,按照我们输入的词顺序匹配,之前的是每个词各自匹配

GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match_phrase": {"Origin":"Cape Town International Airport"}}
}
GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match_phrase": {"Origin":"Cape Town"}}
}
# 中间跳过一个词Town就查不出来,因为没有这个短语
GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match_phrase": {"Origin":"Cape International Airport"}}
}
# slop参数,匹配允许短语间隔误差词数量,中间跳过一个词Town也可以查出来
# slop会耗费计算资源
GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match_phrase": {"Origin":{"query": "Cape International Airport","slop": 1}}}
}
# slop参数,中间跳过两个词
GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match_phrase": {"Origin":{"query": "Cape Airport","slop": 2}}}
}

## Match phase prefix
# 短语前缀查询,集成了短语匹配+前缀
# 前面分词走短语查询
# 最后的分词走前缀查询

# 把Airport的末尾t去掉,效率比slop高效些
GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query":{"match_phrase_prefix": {"Origin":"Cape Town International Airpor"}}
}

## Multi match 多字段
# 很多应用场景需要同时查询多个字段,查询内容一样如电商领域,商品标题与商品描述
# Multimatch专门解决此场景需求,单个字段查询时等同与match匹配

## type 匹配类型
# best_fields,多字段中选择分值最高的字段,默认匹配类型
# most_fields,多字段分值累计和
# cross_fields,多字段查询时,部分分词在第一个字段里,其它的分词在另外的字段里phrase,短语匹配,等同match_phase
# phrase_prefix,短语前缀匹配,等同match_phase_prefix
# bool_prefix,全文匹配逻辑前缀,等同match_bool_prefix.
# tie_breaker,选择多字段分值计算方式,0-选择其中较大的,1-选择合并
# 切换不同的类型(best_fields/most_fields),测试对比前后的分值与结果数量

GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query": {"multi_match": {"query": "Cape Town International Airport","type": "best_fields","fields": ["Origin","Dest"]}}
}
# 还可以使用模糊匹配字段
GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query": {"multi_match": {"query": "Cape Town International Airport","fields": "*rigin"}}
}
# 多个字段匹配,使用^符号和后面增加权重值数字,增加某个字段的权重,类同于单独写boost
GET kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query": {"multi_match": {"query": "Cape Town International Airport","type": "best_fields","fields": ["Origin","Dest^2"]}}
}

## Intervals文本顺序间隔,这个比较复杂一般用不上,需要深入研究
# 间隔查询是全文分词非常⾼级的查询能⼒,容许控制输入分词查询与内容之间的间隔。⽀持了多种间隔类型机制。
# 多个查询检索条件有先后,先基于第⼀个条件查询,之后在结果集上执⾏后⾯的查询条件,类似于 if,then 逻辑

## intervals match 间隔匹配查询
# match,关键字,间隔查询的全文分词⽅式,等同前⾯的match查询
# query,关键字,查询输入的内容
# max_gaps,关键字,容许中间间隔最⼤的词数量,默认-1,不限制
# ordered,关键字,查询的内容是否必须符合顺序,取值true/false,默认false
# analyzer,关键字,分词器
# filter,关键字,⼆级查询过滤器,⽀持多种过滤类型
# use_field,⾃定义字段类型,

## filter 参数说明,⼆级查询过滤器,⽀持多种过滤类型
# 类型             说明
# after            query查询在此之后执⾏
# before           query查询在此之前执⾏
# contained_by     包含此执⾏条件之内的结果
# containing       包含此执⾏条件
# not_contained_by 不在此执⾏结果之内
# not_containing   不包含此条件
# not_overlapping  不重叠条件
# overlapping      重叠条件
# script           基于painless脚本限制

POST kibana_sample_data_flights_fulltext/_search
{"track_total_hits": true,"query": {"intervals": {"Dest": {"match": {"ordered": true,"query": "Sydney Smith Airport","analyzer": "standard","max_gaps": 2,"filter": {"containing": {"match": {"query": "International"}}}}}}}
}

## Query String查询字符
# DSL查询比较复杂,ES也提供了类似SOL表达式的查询方式,但功能性上并未超越DSL,仅仅是方便
# 优缺点优点:简单直接
# 缺点:语法阅读困难,表达能力有限,建议尽量不使用

# 查询Dest,用or的方式
POST kibana_sample_data_flights_fulltext/_search
{"query":{"query_string": {"query": "Dest:(Phoenix or Ministro)"}}
}
# 查询数字范围
POST kibana_sample_data_flights_fulltext/_search
{"query":{"query_string": {"query": "FlightDelayMin:[10 TO 100]"}}
}

## Url查询字符
# 查询表达式基于URL的形式
## 优缺点
# 优点:简洁直接
# 缺点:表达能力局限,极少情况下应用,建议使用DSL

POST kibana_sample_data_flights_fulltext/_search?q=(Dest:Phoenix) AND (Origin:Chubu)

### 查询性能分析
## Profile性能分析
# 1.基于查询树,生成性能分析报告
# 2.与传统关系型数据库执行计划一样等价
# 3.Kibana具备可视化功能,看懂需要一定功力

POST kibana_sample_data_flights_fulltext/_search
{"profile":true,"query":{"query_string": {"query": "Dest:(Phoenix or Ministro)"}}
}

 profile查询解结果如下

还可使用search profiler如下

 ## Explain分值计算评估,有兴趣可以深入
# 1.解释分值计算逻辑与规则
# 2.帮助理解全文查询分值计算信息

POST kibana_sample_data_flights_fulltext/_explain/74TR0Y8BbWz2Sn6EhZCn
{"query":{"match": {"Dest": "Ministro Pistarini International Airport"}}
}

_explain结果如下,这是Dest字段ministro的分值计算

## 全文查询建议
# 全文文本查询是非精确查询(可以通过一些参数控制位精确查询)
# 查询关联度与分词算法(需要去了解,查询结果不是想要的并非是es错误)
# 查询精确度问题(近似值)

elasticsearch text 文本字段类型官⽅参考 https://www.elastic.co/guide/en/elasticsearch/reference/8.6/text.html

elasticsearch analysis-analyzers 内置分词器官⽅参考 https://www.elastic.co/guide/en/elasticsearch/reference/8.6/analysis-analyzers.html

elasticsearch full-text-queries 全文查询官⽅参考 https://www.elastic.co/guide/en/elasticsearch/reference/8.6/full-text-queries.html

elasticsearch query-dsl-intervals-query 间隔查询官⽅参考 https://www.elastic.co/guide/en/elasticsearch/reference/8.6/query-dsl-intervals-query.html

elasticsearch index-modules-similarity

elasticsearch similarity 相似度算法官⽅参考 https://www.elastic.co/guide/en/elasticsearch/reference/8.6/index-modules-similarity.html https://www.elastic.co/guide/en/elasticsearch/reference/8.6/similarity.html

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

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

相关文章

如何保证消息队列的高可用?(RabbitMQ)

RabbitMQ 是基于主从(非分布式)做高可用性的,RabbitMQ 有三种模式:单机模式、普通集群模式、镜像集群模式 1、单机模式:一般没人生产用单机模式 2、普通集群模式: 普通集群模式用于提高系统的吞吐量&…

CAPL如何设置或修改CANoe TCP/IP协议栈的底层配置

在CANoe中创建网络节点作为以太网主机时,可以给其配置独立的TCP/IP Stack。 配置的协议栈有一些底层配置参数可以在界面上设置或修改,比如: MTU上图中MTU显示500只是图形界面显示错误,正确值是1500。 TCP延迟确认这些参数也可以通过CAPL动态配置,甚至CAPL还可以配置很多界…

Linux中vi和vim的区别详解

文章目录 Linux中vi和vim的区别详解一、引言二、vi和vim的起源与发展三、功能和特性1、语法高亮2、显示行号3、编辑模式4、可视化界面5、功能扩展6、插件支持 四、使用示例1、启动编辑器2、基本操作 五、总结 Linux中vi和vim的区别详解 一、引言 在Linux系统中,vi和…

如何将自己的PHP类库发布到composer仓库

将自己的 PHP 类库发布到 Composer 仓库,需要经过一系列的准备和操作步骤,以下是详细说明: 准备工作 创建类库项目:确保你的 PHP 类库项目具有清晰的目录结构,遵循 PSR-4 等 PHP 编码规范。通常,类文件应…

android——录制屏幕

录制屏幕 1、界面 2、核心代码 import android.app.NotificationChannel import android.app.NotificationManager import android.app.PendingIntent import android.app.Service import android.content.Context import android.content.Intent import android.graphics.Bi…

自学高考的挑战与应对:心理调适、学习方法改进与考试技巧提升

一、自学参加高考的成功条件 (一)报名条件 基本要求 自学参加高考,首先需严格遵守国家的法律法规,这是参与高考的基本前提。具备高中同等学力是核心要素之一,意味着考生需通过自学掌握高中阶段的知识体系与学习能力…

SQL语句错误号:Incorrect integer value: ‘‘ for column ‘poi_id‘ at

SQL语句错误号:Incorrect integer value: for column poi_id at通用解决方案 在MySQL 5.7中,如果你遇到 Incorrect integer value: for column poi_id at row 1 错误,这通常意味着你尝试将一个空字符串插入到需要整数值的字段中。以下是几…

【密码学】SM4算法

一、 SM4算法简介 SM4算法是中国国家密码管理局于2012发布的一种分组密码算法,其官方名称为SMS4(SMS4.0),相关标准为GM/T 0002-2012《SM4分组密码算法》。SM4算法的分组长度和密钥长度均为128比特,采用非平衡Feistel结构。采用32…

Qt Xlsx安装教程

Qt Xlsx安装教程 安装perl 如果没有安装perl,请参考perl Window安装教程 下载QtXlsxWriter源码 下载地址 ming32-make编译32 lib库 C:\Qt\Qt5.12.12\5.12.12\mingw73_32>d: D:\>cd D:\Code\QtXlsxWriter-master\QtXlsxWriter-master D:\Code\QtXlsxWrit…

1. 机器学习基本知识(3)——机器学习的主要挑战

1.5 机器学习的主要挑战 1.5.1 训练数据不足 对于复杂问题而言,数据比算法更重要但中小型数据集仍然很普遍,获得额外的训练数据并不总是一件轻而易举或物美价廉的事情,所以暂时不要抛弃算法。 1.5.2 训练数据不具有代表性 采样偏差&#…

通配符SSL证书申请

一、通配符SSL证书点击DV类型通配符SSL证书 二、点击立即生成证书,可以自己在线生成CSR提交,生成的时候私钥代码保存一下。 三、点击继续【建议选择DNS,DNS是指域名解析方式认证】 四、然后去域名注册商添加解析,解析如果可以设置…

个人ffmpeg笔记(一)

环境安装 QT环境安装 运行qt…run安装 下载地址:https://download.qt.io/archive/qt/ 下载地址:https://download.qt.io/archive/qt/5.12/5.12.10/ sudo apt install --reinstall libxcb-xinerama0 解决xcb问题 Ubuntu16.04打开Qt显示/home/user/.co…

JavaEE之多线程的风险以及如何避免

上文我们了解了单线程以及线程的一些基本常见方法,但是多线程在一些方面会存在安全问题,此文我们来为多线程的安全 保驾护航!! 详情请见下文 1. 多线程带来的风险——线程安全 1.1 观察线程不安全 /*** 使用两个线程&#xff0c…

LoViT: 用于手术阶段识别的长视频Transformer|文献速递-生成式模型与transformer在医学影像中的应用

Title 题目 LoViT: Long Video Transformer for surgical phase recognition LoViT: 用于手术阶段识别的长视频Transformer 01 文献速递介绍 快速发展的手术数据科学(SDS)领域旨在通过先进利用手术室(OR)内医疗设备采集的数据…

pika:适用于大数据量持久化的类redis组件|简介及安装(一)

文章目录 0. 引言1. pika简介2. pika安装3. pika设置开机自启4. pika主从搭建5. pika哨兵模式实现自动容灾总结 0. 引言 最近因为公司中用到pika组件,于是将研究过程和理解进行系统记录,以供后续参考。 1. pika简介 pika是360开发的一款国产类redis的…

LNMP和Discuz论坛

文章目录 LNMP和Discuz论坛1 LNMP搭建1.1 编译安装nginx服务1.1.1 编译安装1.1.2 添加到系统服务 1.2 编译安装MySQL服务1.2.1 准备工作1.2.2 编辑配置文件1.2.3 设置路径环境变量1.2.4 数据库初始化1.2.5 添加mysqld系统服务1.2.6 修改mysql的登录密码 1.3 编译安装PHP服务1.3…

Yocto 项目运行超出 BitBake 范围的内容

尽管 Yocto 项目依赖 BitBake 解析和调度元数据来完成构建,但在实际开发中,可能需要执行超出 BitBake 直接管理范围的任务。例如,调用外部脚本或工具完成一些特定的处理逻辑,如生成配置文件、执行硬件初始化脚本或调用第三方构建工…

SpringBoot+OSS文件(图片))上传

SpringBoot整合OSS实现文件上传 以前,文件上传到本地(服务器,磁盘),文件多,大,会影响服务器性能 如何解决? 使用文件服务器单独存储这些文件,例如商业版–>七牛云存储,阿里云OSS,腾讯云cos等等 也可以自己搭建文件服务器(FastDFS,minio) 0 过程中需要实名认证 … 1 开…

生产慎用之调试日志对空间矢量数据批量插入的性能影响-以MybatisPlus为例

目录 前言 一、一些缘由 1、性能分析 二、插入方式调整 1、批量插入的实现 2、MP的批量插入实现 3、日志的配置 三、默认处理方式 1、基础程序代码 2、执行情况 四、提升调试日志等级 1、在logback中进行设置 2、提升后的效果 五、总结 前言 在现代软件开发中,性能优…

SQL 在线格式化 - 加菲工具

SQL 在线格式化 打开网站 加菲工具 选择“SQL 在线格式化” 或者直接访问 https://www.orcc.online/tools/sql 输入sql,点击上方的格式化按钮即可 输入框得到格式化后的sql结果