谷粒商城实战笔记-117-全文检索-ElasticSearch-进阶-term查询

文章目录

  • [term 查询](#term 查询)
  • [match_phrase 查询](#match_phrase 查询)
  • [keyword 查询](#keyword 查询)
  • 区别

在Elasticsearch中, term查询是一种基本的查询类型,用于执行不分析(不经过分析器处理)的精确匹配。以下是 term查询以及与 match_phrasekeyword查询的比较和示例:

term 查询

  • 用途:用于执行不分词的精确匹配,适合用于那些不需要分词的字段,如标签(tags)、状态码(status codes)等。
  • 特点term查询不会对查询字符串进行分析,因此它匹配的是确切的值。它通常用于那些不需要全文搜索的字段。

示例

json 复制代码
GET bank/_search
{
  "query": {
    "term": {
      "age": 28
    }
  }
}

这个查询将找到所有age字段值为"28"的文档。

term最佳实践

term查询适用非text类型,但语法上,对text类型使用term查询也不会报错,但并不推荐这样做。理由如下:

  1. 不进行分析term查询不会对查询字符串进行分析。这意味着,即使字段是text类型,term查询也会尝试进行精确匹配。

  2. 可能的不匹配 :由于text类型的字段在索引时会被分析器分解成单个词元(tokens),使用term查询可能会导致查询不匹配任何文档,因为查询字符串没有被分解成与索引时相同的词元。

  3. 大小写敏感term查询是大小写敏感的,而text字段的分析通常包括将文本转换为小写。这意味着即使文档中包含查询字符串,但由于大小写不匹配,term查询可能找不到匹配项。

  4. 不使用全文搜索功能 :使用term查询text字段将绕过全文搜索功能,如词干提取、同义词处理等,这些功能通常用于提高搜索的相关性。

  5. 可能的性能影响 :由于term查询通常用于keyword类型的字段,这些字段在索引时不会被分析,因此使用term查询text字段可能不会利用Elasticsearch的缓存机制,这可能会对查询性能产生负面影响。

示例 :如果你有一个text类型的字段content,并且你尝试使用term查询来搜索一个完整的短语:

json 复制代码
{
  "query": {
    "term": {
      "content": {
        "value": "The quick brown fox"
      }
    }
  }
}

这个查询可能不会返回任何结果,因为content字段在索引时已经被分词器分解成了单独的词元,而term查询期望找到精确的字符串"The quick brown fox",包括空格和大小写。

如果确实需要在text字段上执行精确匹配,应该考虑使用keyword类型的字段,或者在查询时使用match查询而不是term查询。使用match查询可以利用Elasticsearch的全文搜索功能,包括分词器的处理。

match_phrase 查询

  • 用途:用于执行全文搜索,匹配短语或多个词的精确顺序。
  • 特点match_phrase查询会对查询字符串进行分词,并尝试匹配整个短语或词的顺序。它适用于需要考虑词序的全文搜索场景。

示例

json 复制代码
{
  "query": {
    "match_phrase": {
      "description": "quick brown fox"
    }
  }
}

这个查询将找到所有description字段包含"quick brown fox"这个短语的文档,并且词的顺序与查询中相同。

keyword 查询

  • 用途 :用于对keyword类型的字段执行精确匹配。
  • 特点keyword查询通常用于那些在索引时不经过分词器处理的字段。它允许用户搜索确切的字符串值,而不考虑分词器的影响。

示例

json 复制代码
{
  "query": {
    "match": {
      "username.keyword": "john_doe"
    }
  }
}

这个查询将找到所有username字段的keyword子字段值为"john_doe"的文档。

区别

  • 分词器termkeyword查询不会对查询字符串进行分析,而match_phrase会。
  • 用途term适合于不需要分析的字段,keyword查询通常用于keyword类型的字段,而match_phrase适合于需要考虑词序的全文搜索。
  • 匹配方式termkeyword查询匹配的是确切的值,而match_phrase匹配的是短语和词的顺序。

在实际使用中,选择哪种查询类型取决于字段的索引方式和搜索需求。如果字段是text类型,可能需要使用matchmatch_phrase查询;如果字段是keyword类型,或者需要执行不分词的精确匹配,可以使用termkeyword查询。

相关推荐
不会编程的懒洋洋1 小时前
Spring Cloud Eureka 服务注册与发现
java·笔记·后端·学习·spring·spring cloud·eureka
垂杨有暮鸦⊙_⊙2 小时前
阅读2020-2023年《国外军用无人机装备技术发展综述》笔记_技术趋势
笔记·学习·无人机
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ2 小时前
idea 弹窗 delete remote branch origin/develop-deploy
java·elasticsearch·intellij-idea
Xiao Fei Xiangζั͡ޓއއ2 小时前
一觉睡醒,全世界计算机水平下降100倍,而我却精通C语言——scanf函数
c语言·开发语言·笔记·程序人生·面试·蓝桥杯·学习方法
baijin_cha3 小时前
机器学习基础04_朴素贝叶斯分类&决策树分类
笔记·决策树·机器学习·分类
波克比QWQ3 小时前
rust逆向初探
笔记·rust逆向
LuckyLay3 小时前
Spring学习笔记_36——@RequestMapping
java·spring boot·笔记·spring·mapping
坚硬果壳_3 小时前
《硬件架构的艺术》笔记(一):亚稳态
笔记·学习
qiyi.sky4 小时前
JavaWeb——Web入门(8/9)- Tomcat:基本使用(下载与安装、目录结构介绍、启动与关闭、可能出现的问题及解决方案、总结)
java·前端·笔记·学习·tomcat
dal118网工任子仪4 小时前
web安全漏洞之ssrf入门
笔记·学习·计算机网络·网络安全