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

news2024/10/5 9:32:21

文章目录

  • 一、Term query简介
  • 二、Term query和Match query对比
    • 1. 数据准备
    • 2. 使用Match query查询
    • 3. 使用Term query查询
  • 三、分词器修改字段值的场景
    • 1. 删除大多数标点符号
    • 2. 英文大写转小写
    • 3. 超过max_token_length部分单独拆分

一、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
    在这里插入图片描述

二、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"
    }
  }
}

可以查询到结果
在这里插入图片描述
查询full_name字段

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

同样也可以查询到结果
在这里插入图片描述

3. 使用Term query查询

查询name字段

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

可以查询到结果

在这里插入图片描述

查询full_name字段

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

没有查到结果
在这里插入图片描述

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

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

在这里插入图片描述

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

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

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

可以看到,zhang san确实被拆分为了zhangsan两部分。
在这里插入图片描述
所以使用Term query查询时,如果直接查询zhang san是查询不到结果的。

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

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

1. 删除大多数标点符号

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

在这里插入图片描述
可以对比下如果是whitespace分词器则可以识别出标点符号

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

可以看到hello!并没有被拆分开。
在这里插入图片描述

2. 英文大写转小写

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

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

经过standard分词器后,大写的英文字母都被转换成了小写,所以,此时如果你还是按照Hello来查询的话,是不会查询到结果的,这点要特别注意。
在这里插入图片描述

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。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机模型机设计】8指令多周期(硬布线)MIPS CPU设计报告

2023年第一篇文章来咯~ 8指令多周期(硬布线)MIPS CPU设计报告一、设计概述(基本类似于上一篇)1.1设计目的1.2设计任务1.3设计要求1.4技术指标二、总体方案设计2.1主要功能部件2.2数据通路设计三、详细设计与实现3.1主要功能部件的…

Cookie 和 Session、实现用户登录逻辑

Cookie 和 Session一、回忆 Cookie二、理解会话机制 (Session)三、Cookie 和 Session 的区别四、核心方法4.1 HttpServletRequest 类中的相关方法4.2 HttpServletResponse 类中的相关方法4.3 HttpSession 类中的相关方法4.4 Cookie 类中的相关方法五、代码示例: 实现用户登陆5.…

转速传感器信号隔离变送模块PCB焊接方波信号输出

特点 转速传感器信号直接输入,方波信号输出正弦波、锯齿波信号输入,方波信号输出200mV峰值微弱信号的放大与整形不改变原波形频率,响应速度快电源、信号:输入/输出 3000VDC三隔离辅助电源:5V、12V、15V或24V直流单电源…

【学Vue就像玩一样】什么是计算属性?什么使监视属性?

目录 1.计算属性 2.监视属性 2.1监视属性 2.2深度监视 3.computed和watch的区别 本栏会细致的将Vue划分为两大模块,基础篇,进阶篇。想要顺利通关vue篇首先要拥有三剑客,当然node ajax法宝也会辅佐你通关的,在学习的途中如果遇…

【回答问题】ChatGPT上线了!给我推荐20个比较流行的自动驾驶算法模型

给我推荐20个比较流行的自动驾驶算法模型 当前比较流行的自动驾驶模型有: 卷积神经网络(CNN) 长短时记忆网络(LSTM) 自适应调和滤波器(ADF) 自适应估计滤波器(AEF) 线性…

Vue组件及组件之间的通信

目录 一、Vue脚手架的使用 1、通过命令行使用vue-cli的指令创建:vue init webpack 项目名称 2、使用webStorm软件:本质仍然使用vue脚手架 3、使用vue ui创建:vue提供的图形化的操作界面 二、Vue的组件和组件之间的通信 1、组件&#xff…

使用线性回归、LGBM对二手车价格进行预测

使用线性回归、LGBM对二手车价格进行预测 目录使用线性回归、LGBM对二手车价格进行预测说明数据导入、查看和清洗数据说明导入训练集导入测试集合并数据查看数据整体情况处理数据检查并处理缺失变量EDA年份和价格地区和价格前任里程和价格燃料类型和价格传动装置类型Mileage与价…

数据库 SQL 高级用法

目录 一、INSERT INTO SELECT 用法 二、逻辑控制语句 三、公式表表达式 四、存储程序 五、触发器 一、INSERT INTO SELECT 用法 INSERT INTO SELECT 语句从一个表复制数据,然后把数据插入到一个已存在的表中。 1、从一个表中复制所有的列插入到另一个已存在的表…

React(coderwhy)- 01

React的介绍(技术角度) React是什么?React:用于构建用户界面的 JavaScript 库React的官网文档:https://zh-hans.reactjs.org/React的特点: 声明式编程组件化开发多平台适配Hello React react需要3个依赖&am…

【数字图像处理】骨骼锐化

源码链接:skeleton.cpp 一、实验要求 附件是人体骨骼核扫描图像,我们的目的是通过图像锐化突出骨骼的更多细节来增强图像。图像灰度的动态范围很窄并且有很高的噪声内容。 二、实验内容 按照课本冈萨雷斯的《数字图像处理》上面的思路,整…

【代码题】五道链表面试题

目录 1.移除链表元素 2.反转链表 3.链表的中间结点 4.链表中倒数第k个结点 5.合并两个有序链表 1.移除链表元素 点击进入该题 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回新的头节点 。 思路&am…

CTF-AWD入门手册

引文 AWD赛制是一种网络安全竞赛的赛制。AWD赛制由安全竞赛专家及行业专家凭借十多年实战经验,将真实网络安全防护设备设施加入抽象的网络环境中,模拟政府、企业、院校等单位的典型网络结构和配置,开展的一种人人对抗的竞赛方式,…

语言和文法的形式定义---编译原理

文法的构建问题 * 参考已有的模型 最经典的即是算数表达式的模型,其有多个算术运算符号和优先级别。 文法与正则表达式与有穷自动机的转换 显然是3型文法,也就是正则文法才有相应的性质,因为只有3型文法才是右部至多仅有两个符 号&#xf…

【Vue路由】props配置、replace属性、编程式路由导航、缓存路由组件

文章目录props配置props值为对象props值为布尔值props值为函数总结\<router-link>的replace属性总结编程式路由导航案例实现总结缓存路由组件案例实现总结props配置 我们可以看看我们原来如何使用传递过来的参数的&#xff1a; 我们要写一大长串去从$route身上拿到我们…

传统目标跟踪——光流法

目录 一、光流法 二、LK光流法 2.1 实现原理 2.2 API 三、代码 四、总结 一、光流法 光流&#xff1a;空间运动物体在观察成像平面上像素运动的瞬时速度。 光流法利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧之间存在的对应关系&#xff0c;…

密码学_RSA

RSA是1977年由罗纳德李维斯特&#xff08;Ron Rivest&#xff09;、阿迪萨莫尔&#xff08;Adi Shamir&#xff09;和伦纳德阿德曼&#xff08;Leonard Adleman&#xff09;一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。 RSA是非…

dom截图的几种实现方式

前端要实现dom截图的功能&#xff0c;现在比较常用的是使用以下两个库 dom-to-image 使用svg技术实现html2canvas 使用canvas技术实现 如果想自己写一个dom截图的可以参考 dom-pointer 代码比较简单&#xff0c;非常适合拿来研究rasterizeHTML.js 目前rasterizeHTML.js已经被…

1231. 航班时间(恶心的输入处理 + 简单的数学)

题目如下&#xff1a; 题解 or 思路&#xff1a; 因为题目假设两次飞行时间是相同的&#xff0c;我们可以通过减法将时差消去。那么飞行时间就是: time1time22\frac{time_1 time2}{2}2time1​time2​ 题目的难点是处理输入&#xff0c;我们可以使用 sscanf 来进行处理&#x…

小程序开发经验分享(1)

账号搭建篇 1. 获取微信小程序的AppID 首先,我们需要拥有一个帐号,如果你能看到该文档,我们应当已经邀请并为你创建好一个帐号。注意不可直接使用服务号或订阅号的AppID。 利用提供的帐号,登录 https://mp.weixin.qq.com ,就可以在网站的“设置”-“开发者设置”中,查…

MySQL高级 SQL优化【插入数据主键优化】

目录 1&#xff1a;SQL优化 1.1&#xff1a;插入数据 1.1.1&#xff1a;insert 1). 优化方案一&#xff08;批量插入数据) 2). 优化方案二&#xff08;手动控制事务&#xff09; 3). 优化方案三 &#xff08;主键顺序插入&#xff0c;性能要高于乱序插入。&#xff09; …