当前位置: 首页 > news >正文

谷粒商城实战笔记-110~114-全文检索-ElasticSearch-查询

文章目录

  • 一,110-全文检索-ElasticSearch-进阶-两种查询方式
  • 二,111-全文检索-ElasticSearch-进阶-QueryDSL基本使用&match_all
  • 三,112-全文检索-ElasticSearch-进阶-match全文检索
  • 四,113-全文检索-ElasticSearch-进阶-match_phrase短语匹配
  • 五,114-全文检索-ElasticSearch-进阶-multi_match多字段匹配

一,110-全文检索-ElasticSearch-进阶-两种查询方式

Elasticsearch两种基本的检索方式使用Elasticsearch REST API的说明:

  1. 使用REST request URI发送搜索参数
    这种方式是通过GET请求将查询参数附加在URL上。这适用于简单的查询,并且可以很容易地在浏览器中测试。例如,上面的查询示例:

    GET bank/_search?q=*&sort=account_number:asc
    
    • GET 是HTTP方法,用于请求从服务器获取资源。
    • bank 是索引的名称。
    • _search 是一个特殊的端点,用于执行搜索查询。
    • q=* 是查询参数,* 表示搜索所有文档。
    • sort=account_number:asc 指定了排序方式,这里按照account_number字段升序排序。
  2. 使用REST request body发送搜索参数
    这种方式是通过POST请求发送一个JSON格式的请求体。它提供了更复杂的查询能力,并且可以包含多个查询参数和选项。例如,上面的查询示例:

    POST bank/_search
    {"query": {"match_all": {}},"sort": [{"account_number": {"order": "desc"}}]
    }
    
    • POST 是HTTP方法,通常用于向服务器提交要被处理的数据。
    • bank/_search 同样指定了索引和搜索端点。
    • 请求体中的 "query": { "match_all": {} } 定义了一个查询,match_all 查询将匹配所有文档。
    • "sort" 数组定义了排序规则,这里指定了按照account_number字段降序排序。

两种方式的主要区别在于查询的复杂性和灵活性。使用URI的方式简单直观,适合快速测试和简单的查询。使用请求体的方式则更适合复杂的查询,可以包含更多的选项和参数。

二,111-全文检索-ElasticSearch-进阶-QueryDSL基本使用&match_all

GET bank/_search
{"query": {"match_all": {}},"sort": [{"balance": {"order": "desc"}}],"from": 5,"size": 5,"_source": ["balance", "firstname"]
}
  1. GET bank/_search:这是HTTP请求的开始,其中GET是请求方法,bank是索引的名称,_search是执行搜索查询的端点。

  2. "query": {:定义查询的开始。

  3. "match_all":():这是一个查询子句,match_all查询会匹配所有文档。括号()在这里应该是空的,因为match_all查询不需要任何参数。

  4. 'sort": [:这个部分看起来像是一个语法错误,因为sort关键字后面紧跟着一个单引号',这可能是一个复制粘贴错误。正确的应该是"sort": {,用于定义排序规则。

  5. "balance"::这是排序规则的一个字段,表示按照balance字段进行排序。

  6. "orden": "desc":指定排序的顺序,"desc"表示降序排序。

  7. "from": 5,:定义从结果的哪个位置开始返回,这里设置为5,意味着从第6个结果开始返回。

  8. "size": 5,:定义返回结果的数量,这里设置为5,意味着返回5个结果。

  9. _source": ["balance","firstname"]:定义返回的源字段,这里指定返回balancefirstname字段的值。

在这里插入图片描述

这个查询会从bank索引中检索所有文档,按照balance字段降序排序,跳过前5个结果,然后返回接下来的5个结果,并且只返回每个结果的balancefirstname字段。

三,112-全文检索-ElasticSearch-进阶-match全文检索

match query是一种模糊匹配,查询时会将关键词进行分词处理,然后基于倒排索引进行匹配,对于匹配到的结果进行打分,返回结果按照评分进行排序。

如下查询。


GET bank/_search
{"query": {"match": {"address": "mill"}}
}

这个查询同样是针对Elasticsearch的"bank"索引的一个搜索请求,使用match查询来执行全文搜索。

  • GET bank/_search: 这表示使用HTTP GET方法发起请求,目的是对"bank"索引进行搜索。

  • "query": 这部分定义了搜索的查询条件。

  • "match": 这是Elasticsearch中用于执行全文搜索的查询类型,它会在指定的字段上进行搜索。

  • "address": 这是要搜索的字段名称,即文档中的"address"字段。

  • "Mill road": 这是搜索的关键词,查询会寻找"address"字段中包含"Mill road"这个确切短语的文档。

匹配查询有两种可能:

  1. 完全匹配: 文档的"address"字段完全包含"Mill road"这个短语,例如:“123 Mill road”。

  2. 部分匹配: 搜索关键词"Mill road"会被分词为"mill"和"road",如果"address"字段包含"Mill"和"road",就会被匹配到,如"198 Mill Lane"或"263 Aviation Road"。

在这里插入图片描述
查询结果显示,一共有32个文档被匹配,每个结果都有评分,最高评分是8.926605,返回结果默认按照评分降序排序。显然,评分最高的是与搜索关键词匹配度最高的文档。

四,113-全文检索-ElasticSearch-进阶-match_phrase短语匹配

match_phrasematch类似,都是在指定的字段中进行全文搜索,不同的是match_phrase要匹配整个短语中所有的词,match匹配单个词就算命中,match_phrase查询还关注词的顺序和位置,它返回的是那些在指定字段中包含整个短语的文档。

以下是match_phrase查询的一些关键点:

  1. 短语匹配: match_phrase会寻找包含整个短语的文档,而不是单独的词。

  2. 词序: 它匹配的是短语中词的顺序,即短语中的词必须按照指定的顺序出现。

  3. 位置敏感: 短语中的词之间可以有其他词,但它们必须在短语中指定的顺序内。

  4. 使用场景: 当你需要搜索包含特定短语的文档时,比如搜索包含完整地址或名称的文档,match_phrase是一个很好的选择。

  5. 性能: 由于match_phrase查询需要考虑词的顺序和位置,它可能比match查询在性能上要慢一些。

  6. 分析器: 与match查询一样,match_phrase也受到字段使用的分析器的影响。不同的分析器可能会影响搜索结果。

  7. 语法: match_phrase查询的语法与match类似,但是它更专注于短语的完整性和顺序。

这里是一个使用match_phrase查询的示例:

GET bank/_search
{"query": {"match_phrase": {"address": "Mill Road"}}
}

在这个示例中,查询会寻找"address"字段中包含"Mill Road"这个确切短语的文档,并且词的顺序和大小写都需要匹配。如果"address"字段包含"Mill Road",但是顺序或大小写不同,或者两个词中间有其他词,那么这些文档将不会被匹配。

五,114-全文检索-ElasticSearch-进阶-multi_match多字段匹配

multi_match查询允许在多个字段上执行相同的搜索查询,只要一个字段匹配,这条记录就会被命中。

下面是一个使用multi_match查询的示例:

GET bank/_search
{"query": {"multi_match": {"query": "Albemarle","fields": ["address", "firstname"]}}
}

在这个示例中,查询会在addressfirstname字段上搜索包含"Albemarle"的文档。如果这些字段中的任何一个包含这个短语,文档就可能被返回在搜索结果中。

如下,firstname包含Albemarleaddress中不包含Albemarle,但文档也会被命中。

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • CTFSHOW 萌新 web10 解题思路和方法(passthru执行命令)
  • 如何获取和安装SSL证书
  • PHP反序列化漏洞从入门到深入8k图文介绍,以及phar伪协议的利用
  • C#类和结构体的区别
  • 2.MySQL库的操作
  • C++ 智能指针简单介绍及用法
  • 微调(二)
  • Java与Python谁更适合后端开发?
  • 计算机网络-七层协议栈介绍
  • Qt pdf文件操作
  • 学习记录day18——数据结构 算法
  • Hadoop学习(三)
  • AI PC处理器架-低功耗、NPU算力、大模型
  • Java面试题--多线程
  • Java基础总结
  • hexo+github搭建个人博客
  • centos安装java运行环境jdk+tomcat
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Java多线程(4):使用线程池执行定时任务
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • React-Native - 收藏集 - 掘金
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 基于组件的设计工作流与界面抽象
  • 设计模式走一遍---观察者模式
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 我的面试准备过程--容器(更新中)
  • 小而合理的前端理论:rscss和rsjs
  • 由插件封装引出的一丢丢思考
  • 主流的CSS水平和垂直居中技术大全
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 阿里云服务器如何修改远程端口?
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​Spring Boot 分片上传文件
  • # 安徽锐锋科技IDMS系统简介
  • # 数据结构
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #define 用法
  • #QT项目实战(天气预报)
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (pycharm)安装python库函数Matplotlib步骤
  • (Qt) 默认QtWidget应用包含什么?
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (回溯) LeetCode 78. 子集
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (四) 虚拟摄像头vivi体验
  • (一)Docker基本介绍
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转载)Linux 多线程条件变量同步