使用ES Term query查询时一定要注意的地方

这篇具有很好参考价值的文章主要介绍了使用ES Term query查询时一定要注意的地方。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Term query简介

使用Term query可以根据精确值查找相关文档数据,不过Term query查询与Match query查询还是有区别的,有时候你会发现用Match query可以查到,换成Term query却不行,本文整理一些使用Term query容易出错的点供参考。

如果你查看Term query的官方文档,你就会发现,官网首先对Term query做了3项明确说明。

  • 避免是对text属性的字段使用Term query查询。
  • Elasticsearch会因为分词器的原因改变字段的值,所以如果想要精确匹配text类型的字段将会很难。
  • 如果查询text类型的字段,建议使用Match query
    使用ES Term query查询时一定要注意的地方

二、Term query和Match query对比

1. 数据准备

建立一个索引,其中namekeyword类型,full_nametext类型。

PUT /test-index
{
  "mappings": {
    "_doc": {
      "properties": {
        "name": {
          "type": "keyword"
        },
        "full_name": {
          "type": "text"
        }
      }
    }
  }
}

插入一条数据

PUT /test-index/_doc/1
{
  "name":"zhang",
  "full_name":"zhang san"
}

2. 使用Match query查询

查询name字段

GET /test-index/_search
{
  "query": {
    "match": {
      "name": "zhang"
    }
  }
}

可以查询到结果
使用ES Term query查询时一定要注意的地方
查询full_name字段

GET /test-index/_search
{
  "query": {
    "match": {
      "full_name": "zhang san"
    }
  }
}

同样也可以查询到结果
使用ES Term query查询时一定要注意的地方

3. 使用Term query查询

查询name字段

GET /test-index/_search
{
  "query": {
    "term": {
      "name": "zhang"
    }
  }
}

可以查询到结果

使用ES Term query查询时一定要注意的地方

查询full_name字段

GET /test-index/_search
{
  "query": {
    "term": {
      "full_name": "zhang san"
    }
  }
}

没有查到结果
使用ES Term query查询时一定要注意的地方

但是如果你按空格拆开来查询,比如只查询zhang或者san,是可以查询到结果的(Match query拆分后也可以查询到结果

GET /test-index/_search
{
  "query": {
    "term": {
      "full_name": "zhang"
    }
  }
}

使用ES Term query查询时一定要注意的地方

好了,到此就解释了为什么官网要做那三项说明,简单来说就是当使用Term query查询时,如果是text类型,会按照分词后的结果来进行匹配,而分词的规则,如果你掌握不好,那么查询时就很容易出错了。

我们也可以验证一下在standard分词器下,zhang san的分词结果。

POST _analyze
{
  "analyzer": "standard",
  "text": "zhang san"
}

可以看到,zhang san确实被拆分为了zhangsan两部分。
使用ES Term query查询时一定要注意的地方
所以使用Term query查询时,如果直接查询zhang san是查询不到结果的。

三、分词器修改字段值的场景

我们知道Elasticsearch的有多种分词器,你也可以自定义分词器,所以实际上在不同的分词器下,zhang san可能有不同的拆分方法,就像前面说的,分词的规则如果你掌握不好,就会导致查询的结果和你设想中的结果不匹配,下面,我们可以来看看默认的分词器standard analyzer,会有哪些改变字段值的场景?

1. 删除大多数标点符号

POST _analyze
{
  "analyzer": "standard",
  "text": "hello! zhang san"
}

使用ES Term query查询时一定要注意的地方
可以对比下如果是whitespace分词器则可以识别出标点符号

POST _analyze
{
  "analyzer": "whitespace",
  "text": "hello! zhang san"
}

可以看到hello!并没有被拆分开。
使用ES Term query查询时一定要注意的地方

2. 英文大写转小写

这是一个很容易掉坑的地方。

POST _analyze
{
  "analyzer": "standard",
  "text": "Hello Zhang San"
}

经过standard分词器后,大写的英文字母都被转换成了小写,所以,此时如果你还是按照Hello来查询的话,是不会查询到结果的,这点要特别注意。
使用ES Term query查询时一定要注意的地方

3. 超过max_token_length部分单独拆分

max_token_length:最大令牌长度。如果超过此长度,则会被拆分开。默认值为 :255

自定义一个分词器,并设置max_token_length长度为5。

PUT test-analyzer
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "standard",
          "max_token_length": 5
        }
      }
    }
  }
}

看一下分词效果

POST test-analyzer/_analyze
{
  "analyzer": "my_analyzer",
  "text": "Hello, Elasticsearch"
}

可以看到,拆分后的每一项长度最多不会超过5。
使用ES Term query查询时一定要注意的地方文章来源地址https://www.toymoban.com/news/detail-501313.html

到了这里,关于使用ES Term query查询时一定要注意的地方的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ES】es查询term、match、match_phrase、mast_not、mast...

    keyword:不分词 非keyword:分词 对属性名.keyword,就是全值匹配。如果查询的属性是text,就会匹配分词。 term:查询的入参,不会分词。 terms:查询的入参,不会分词。 match:分词匹配 match_phrase:短语匹配,一个slop属性,可以使短语中的词,调换顺序 match_phrase_prefix:分词前缀

    2024年02月22日
    浏览(43)
  • es笔记三之term,match,match_phrase 等查询方法介绍

    本文首发于公众号:Hunter后端 原文链接:es笔记三之term,match,match_phrase 等查询方法介绍 首先介绍一下在 es 里有两种存储字符串的字段类型,一个是 keyword,一个是 text。 keyword 在存储数据的时候是作为一个整体存储的,不会对其进行分词处理 text 存储数据的时候会对字符串

    2024年02月05日
    浏览(53)
  • ES组合查询-Boolean Query

    BooleanQuery可以将多个查询语句组合在一起。下面是一个基础的模板: 上面是从官网搬过来的官网地址 must 中的语句是必须满足的,会影响最终文档的得分 filter 中的语句是必须满足的,但是不会影响最终的得分 must_not 中的语句是必须不满足的, 不影响最终的得分 should 中的语

    2023年04月20日
    浏览(36)
  • 【ES专题】ElasticSearch 高级查询语法Query DSL实战

    个人在学习的过程中,感觉比较吃力的地方有如下: 语法结构比较陌生 没有中文文档, 只能看英文 其他博客也比较少介绍语法结构。比如说,为什么查询中会出现 query 有ES入门基础,且想进一步学习ES基本操作的朋友 系列上一篇文章:《【ES专题】ElasticSearch快速入

    2024年02月06日
    浏览(51)
  • Elasticsearch ES 简单查询 Query String Search 入门

    尝试了text类型排序需要特别处理下. \\\"reason\\\" : \\\"Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [name] in order to load field data by uninverting the inverted index.

    2024年02月16日
    浏览(45)
  • 【ElasticSearch-基础篇】ES高级查询Query DSL全文检索

    和术语级别查询(Term-Level Queries)不同,全文检索查询(Full Text Queries)旨在 基于相关性搜索和匹配文本数据 。这些查询会对输入的文本进行分析,将其 拆分 为词项(单个单词),并执行诸如分词、词干处理和标准化等操作。 全文检索的关键特点: 对输入的文本进行分析

    2024年01月22日
    浏览(53)
  • ElasticSearch系列 - SpringBoot整合ES:查询条件 query 和过滤条件 filter 的区别

    01. Elasticsearch 查询条件和过滤条件的区别? Elasticsearch中的查询条件和过滤条件都是用于搜索和过滤文档的条件,但它们之间有一些区别。 查询条件是用于计算文档相关度得分的条件,它会将所有符合条件的文档按照相关度得分从高到低排序,并返回前N个文档。查询条件可以

    2024年02月14日
    浏览(61)
  • Elasticsearch(es)中must以及term的基本使用

    在 Elasticsearch(ES)中,should 和 must 是布尔查询(Boolean Query)中常用的两个子句。 should 子句:should 表示一个或多个条件之一满足即可匹配文档。它类似于逻辑上的 OR 操作,用于构建可选项或者提升匹配文档的相关性评分。当至少一个 should 子句匹配时,文档将被认为是匹配

    2024年01月22日
    浏览(38)
  • es通过rest接口_search、_delete_by_query查询与删除数据

    1、rest接口查询数据 rest查询: http://localhost:9200/index_name/_search 查询表达式: postman请求截图: 2、使用Rest接口删除数据 rest删除数据: http://localhost:9200/index_name/_delete_by_query 查询表达式: postman请求截图:

    2024年02月16日
    浏览(47)
  • 【ES笔记02】ElasticSearch数据库之查询操作(match、must、must_not、should、_source、filter、range、exists、ids、term、terms)

    这篇文章,主要介绍ElasticSearch数据库之查询操作(match、must、must_not、should、_source、filter、range、exists、ids、term、terms)。 目录 一、布尔查询 1.1、主键查询 1.2、两种查询方式 (1)路径参数查询 (2)请求体参数查询 1.3、match查询 (1)match (2)match_all 1.4、过滤字段 1.5、布

    2023年04月09日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包