谷粒商城实战笔记-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 小时前
Java JVM “内存(1)”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
_dindong2 小时前
Linux网络编程:Socket编程TCP
linux·服务器·网络·笔记·学习·tcp/ip
摇滚侠2 小时前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 属性优先级 行内写法 变量选择 笔记42
java·spring boot·笔记
摇滚侠3 小时前
Spring Boot 3零基础教程,WEB 开发 Thymeleaf 总结 热部署 常用配置 笔记44
java·spring boot·笔记
最好束手就擒3 小时前
Elasticsearch批量写入50万数据
大数据·elasticsearch·jenkins
在未来等你3 小时前
Elasticsearch面试精讲 Day 25:Elasticsearch SQL与数据分析
大数据·分布式·elasticsearch·搜索引擎·面试
rechol3 小时前
汇编与底层编程笔记
汇编·arm开发·笔记
lzj_pxxw4 小时前
嵌入式开发技巧:舍弃标志位,用宏定义函数实现程序单次运行
笔记·stm32·单片机·嵌入式硬件·学习
润 下4 小时前
C语言——回调函数的典型示例(分析详解)
c语言·开发语言·人工智能·经验分享·笔记·程序人生
朝新_4 小时前
【EE初阶 - 网络原理】传输层协议
java·开发语言·网络·笔记·javaee