ES数据类型学习之keyword和text以及查询条件match和term

news2024/9/29 1:18:44

es(4)—查询条件match和term_es match term-CSDN博客

参考文章如上。开始学习

1.text和keyword的学习

直接上官网Text type family | Elasticsearch Guide [7.17] | Elastic

Text type family 

The text family includes the following field types:

  • text, the traditional field type for full-text content such as the body of an email or the description of a product.
  • match_only_text, a space-optimized variant of text that disables scoring and performs slower on queries that need positions. It is best suited for indexing log messages.

服了。这里说text这个类型可以在细分未text和match_only_text

text是用来作为邮件或者是产品说明类型的数据类型

match_only_text是一种空间优化的文本变体,没有相似分数,在需要位置的查询上执行速度较慢。它最适合为日志消息建立索引。

 这里简单的来说就是text字段类型为什么适用于 邮件/产品说明书呢?因为他们是可以被分析的,也就是说一大段文字可以被拆分为很多小段,text字段类型一般也不用排序和聚合。

举个例子,我们的邮箱只会根据时间或者收件人去排序,什么时候根据邮件内容去排序了,如果根据内容去排序,这毫无意义。

text字段是无结构化的,但是人类能够读懂给的文字,如果你需要对【机器生成的文字内容】索引,参考【mapping unstructured content】一般人都不用不到,暂时不学。

如果你需要索引 邮件地址,域名,状态码,标签,这种最好还是用keyword。因为这种比较简单。

 直接上案例。如何创建一个text字段的index

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "full_name": {
        "type":  "text"
      }
    }
  }
}

-- 这个太简单了。。

开始上难度

使用一个复合类型。也就是说同时具有text和 keyword的共性。

比如某个字段,我要求可以模糊匹配,也要求可以排序和聚合

fields | Elasticsearch Guide [7.17] | Elastic

复合字段的案例

 PUT my-index-000001
{
  "mappings": {
    "properties": {
      "city": {
        "type": "text",
        "fields": {
          "raw": {
            "type":  "keyword"
          }
        }
      }
    }
  }
}

-- 注意这里是什么意思呢? 就是说city字段是用text存的,city.raw使用keyword存的

PUT my-index-000001/_doc/1
{
  "city": "New York"
}

-- 这里city text存了new york 方便模糊查询, city.raw存了New York方便精确查询或排序聚合

PUT my-index-000001/_doc/2
{
  "city": "York"
}

GET my-index-000001/_search
{
  "query": {
    "match": {
      "city": "york"
    }
  },
  "sort": {
    "city.raw": "asc"
  },
  "aggs": {
    "Cities": {
      "terms": {
        "field": "city.raw"
      }
    }
  }
}

--有兴趣的自己尝试

GET my-index-000001/_analyze
{
  "field": "city",
  "text": ["New York"]
}
GET my-index-000001/_analyze
{
  "field": "city.raw",
  "text": ["New York"]
}

以前如果就是keyword 或者text 后面也可以通过update mappings去更改  先暂时不看了。

Update mapping API | Elasticsearch Guide [7.17] | Elastic

复合字段带有符合分析器

我上面小小的分析了下,没想到官网很贴心,也给了案例,继续学习

Multi-fields with multiple analyzers

多字段的另一个用例是以不同的方式分析同一字段以获得更好的相关性。例如,我们可以用标准分析器对一个字段进行索引,该分析器将文本分解为单词,也可以用英语分析器将单词转换为词根形式:

简单的来说,就是对同一个字段采取不同的维度去分析。
 

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "fields": {
          "english": {
            "type":     "text",
            "analyzer": "english"
          }
        }
      }
    }
  }
}

PUT my-index-000001/_doc/1
{ "text": "quick brown fox" }

PUT my-index-000001/_doc/2
{ "text": "quick brown foxes" }

GET my-index-000001/_search
{
  "query": {
    "multi_match": {
      "query": "quick brown foxes",
      "fields": [
        "text",
        "text.english"
      ],
      "type": "most_fields"
    }
  }
}

查询结果如下,可以发现我     "query": "quick brown foxes",

这里说明了 text的是标准分词器,text.english是英语分词器,这两个doc 一个是fox一个foxes

查询的时候是根据text和text.english两个字段组成分数。

text字段 里面存的是[fox,foxes]

text.englist里面存的[fox,fox] 因为foxes本身就是fox,

虽然我们查询的两个字段都是foxes,但是在text字段是根据foxes去查询,在text.english字段是根据fox去查询。

还是analysis下

GET my-index-000001/_analyze
{
  "field": "text.english",
  "text": ["quick brown foxes"]
}

发现结果foxes被存储为 fox

        text顾名思义是文本,也就是说只在乎数据本身,不会在乎数据的大小写。比如我存CC LOVE ZBF,text的存储会存cc love zbf

        keyword顾名思义是关键词,也就是说我要找到某条数据只能通过关键词来找,可以看作mysql的自增id

下面学习下match和term的查询区别

2. match和term的区别

  • match会进行分词,将分词后的field去倒排索引寻找文档;
  • term不会进行分词,将原始的field去倒排索引中寻找文档

2.1数据准备

PUT test_match/_mapping
{
  "properties":{
    "text_name":{
      "type":"text"
    },
    "key_name":{
      "type":"keyword"
    }
  }
}

get test_match/_mapping

# 批量插入数据
POST _bulk
{"create":{"_index":"test_match","_type":"_doc"}}
{"text_name":"JAVA BOOK","key_name":"JAVA BOOK"}
{"create":{"_index":"test_match","_type":"_doc"}}
{"text_name":"ES BOOK","key_name":"ES BOOK"}
{"create":{"_index":"test_match","_type":"_doc"}}
{"text_name":"spring","key_name":"spring"}

2.2 倒排索引存储的值

2.2.1数据类型为text

GET test_match/_analyze
{
  "field": "text_name",
  "text": ["JAVA BOOK "]
}

数据被小写,然后分词存放

2.2.1数据类型为keyword

GET test_match/_analyze
{
  "field": "key_name",
  "text": ["JAVA BOOK"]
}

数据直接被存放,没经过任何处理

2.3 使用term查询text类型(不推荐)

使用term查询时,查询条件不会进行分词。但是text类型的数据,在倒排索引中实际存储的是分词的数据。

例如term 查询text_name :JAVA BOOK,但是text_name存放的是[java/ book] 所以查询不到结果

get test_match/_search
{
  "query":{
    "term": {
      "text_name": {
        "value": "JAVA BOOK"
      }
    }
  }
}

-- 备注这里使用小写 java book也查不到

get test_match/_search
{
  "query":{
    "term": {
      "text_name": {
        "value": "java"
      }
    }
  }
}

-- term 查询text字段的 小写分词可以查到 比如查java,因为text_name底层存放"JAVA BOOK"这一个词的时候,将其分为"java"和"book",所以查询java的时候也是命中了索引

想要查"JAVA BOOK"这条数据 查询条件只能是"java" "book"这两条数据

2.4 term查询keyword等类型的数据 

term去查询keyword的数据,均不会进行分词,但是需要注意大小写

get test_match/_search
{
  "query":{
    "term": {
      "key_name": {
        "value": "JAVA BOOK"
      }
    }
  }
}

想要查JAVA BOOK这条数据  value只能是"JAVA BOOK"

2.5 match查询text类型(默认是or操作)

get test_match/_search
{
  "query":{
    "match": {
      "text_name": "JAVA"
    }
  }
}

想要查"JAVA BOOK"这条数据,查询条件可以是"JAVA","BOOK" ,"java","book","java book","java 123456","JAVA 13456999" 等等等

2.6 match的and操作

2.5中查询默认是or操作,比如match查询text_name:"JAVA 12345"首先会将"JAVA 12345"分词为"java","12345"然后在与doc的倒排索引去比对,类似sql中的 select * from table where text_name like '%java%' or text_name like '%12345%'

有时候需要and操作 ,这个就是类似于 select * from table where text_name like '%java%' and text_name like '%12345%'

GET test_match/_search
{
  "query": {
    "match": {
      "text_name":{
        "query": "JAVa book",
        "operator": "and"
      }
    }
  }
}

-- 新增数据

POST test_match/_doc
{
  "text_name":"JAVA AND NET BOOK",
  "key_name":"net"
}

注意这样会匹配到原始数据是"JAVA BOOK" 也可以匹配到 "JAVA 12345 BOOK 456"

2.7 match查询keyword类型 

match查询keyword操作时,等效term

get test_match/_search
{
  "query":{
    "match": {
      "key_name": "JAVA BOOK"
    }
  }
}

想要查找JAVA BOOK,只能通过"JAVA BOOK"

其实这里有点绕了。简单点来看我们先看查询的字段是什么类型text还是keyword

如果是keyword 那么我们查询条件match或term都是一样的

如果是text 那么我们需要人工的思考下 这个条件被分词小写后是什么?

然后我们看查询条件是match 还是term

如果是term就是 column=?

如果是match就思考下原先的数据是否包含了查询条件(原始数据分词后是否包含查询字段的分词)

3. match的底层转换

当match查询text类型时,在底层将会被转换为term操作。

get test_match/_search
{
  "query":{
    "match": {
      "text_name": "JAVA BOOK"
    }
  }
}

被转化为

GET test_match/_search
{
  "query": {
    "bool": {
      "should": [
        {"term": {
          "text_name": {
            "value": "java"
          }
        }},
        {
          "term": {
            "text_name": {
              "value": "book"
            }
          }
        }
      ]
    }
  }
}

也就是说通过term查询小写分词后的数据,满足任一一个分词即可。

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

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

相关文章

默克索引轻松搞定,快速查找!

在化学、药学和生物科学领域,有一部被广泛认可的权威工具书——《默克索引》(Merck Index)。自1889年首次出版以来有130多年的历史,《默克索引》一直被视为化学品、药物和生物制品的关键物理、药理和历史信息的最权威、最可靠的来…

Ubuntu22.04安装NVIDIA Driver和CUDA

Ubuntu22.04安装NVIDIA Driver和CUDA 1.安装NVIDIA Driver(1).卸载Ubuntu自带的驱动程序:(2).禁用nouveau:(3).安装相应的NVIDIA Driver: 2.安装CUDA(1).下载并安装CUDA:(2).配置环境变量: 本文记录了在 "Ubuntu22.04"上安装 "NVIDIA D…

百度关掉Ai智能回答(保姆级技术文,解决过程完整记录)

随着AI时代到来,百度也是不肯落于人后,在其搜索页面推出了AI自动回答。点到这里的你想必正因此懊恼,你说它怎么切入不好,非得搞个东西在那一直跳,顶着下面的内容哐哐直跳,你想好好浏览内容还得等它跳消停了…

C++(week15): C++提高:(四)并发服务器架构模型

文章目录 一、五种网络IO模型1.数据传输过程2.两组重要概念3.五种网络IO模型(1)阻塞式IO(2)非阻塞式IO(3)IO多路复用(4)信号驱动IO(5)异步IO 4.五种网络IO模型的对比5.举例说明 二、并发服务器模型1.循环式迭代式模式2.并发式服务器3.prefork服务器4.反应式服务器 (Reactor)5.反…

协同过滤推荐算法(包括传统协同过滤、矩阵分解、NeuralCF)

一、什么是协同过滤推荐算法 传统的协同过滤(Collaborative Filtering, CF)是一种推荐系统技术,它基于用户的历史行为数据来预测用户对未评分项目的潜在兴趣。 “协同大家的反馈、评价和意见一起对海量的信息进行过滤,从中筛选出…

IPD如何通过数字化项目管理平台落地实施?

随着市场竞争的日益激烈,企业对于产品研发的效率和质量逐渐提高,越来越多的企业关注到IPD(Integrated Product Development),希望参考IPD体系的方法理念和实践经验,从而帮助企业快速响应市场变化、缩短产品开发周期、提升产品开发…

step9:设置软件初始状态获取时不发送配置指令

文章目录 文章介绍问题描述效果图 解决办法下拉框控件ComboBox切换开关组件Switch数值微调框控件SpinBox 文章介绍 问题描述 虚拟端口(硬件)发送信号给客户端电脑,会设置此时硬件的各种基础参数, 客户端软件被设置基础参数之后&a…

计算机视觉——凸包计算

现在有一大堆点,然后你要找出一个可以围住这些点且面积最小的凸多边形,这个凸多边形称为凸包。 显而易见,如果要面积最小,那凸包的顶点势必得是这一大堆点的几个点,你也可以想成是用一条橡皮筋把这些点圈起来。 先把各…

什么是云原生?(一)

1. 前言 停下手头的工作,让你的同事定义“云原生”一词。你很可能会得到几个不同的答案。 1.1 让我们从一个简单的定义开始: 云原生架构和技术是一种设计、构建和操作在云中构建并充分利用云计算模型的工作负载的方法。 1.2 云原生计算基金会给出了官方…

easyexcel使用教程--导入导出简单案例

java中操作excel的库是poi,但是poi有很多问题,使用复杂,内存占用大等,阿里开源了一个操作excel的库叫easyexcel,它基于poi做了很多优化,平时读写excel建议使用这个库 文档地址: 关于Easyexcel | Easy Excel 官网 写入excel 在…

操作无法完成错误0x000006ba?教你几种全面解析与解决方案指南

错误代码0x000006ba通常与 Windows 操作系统中的远程过程调用(RPC)服务有关。当你在尝试执行某些操作,如连接到网络共享、运行某些网络服务或使用依赖于 RPC 的应用程序时,可能会遇到这个错误。接下来就和大家聊聊操作无法完成错误…

“揭秘CentosChina爬虫项目:掌握Scrapy框架的必备技巧与数据库设计“

Centoschina 项目要求 爬取centoschina_cn的所有问题,包括文章标题和内容 数据库表设计 库表设计: 数据展示: 项目亮点 低耦合,高内聚。 爬虫专有settings custom_settings custom_settings_for_centoschina_cncustom_settin…

鸿蒙(API 12 Beta2版)媒体开发【使用OHAudio开发音频播放功能(C/C++)】

OHAudio是系统在API version 10中引入的一套C API,此API在设计上实现归一,同时支持普通音频通路和低时延通路。仅支持PCM格式,适用于依赖Native层实现音频输出功能的场景。 使用入门 开发者要使用OHAudio提供的播放或者录制能力&#xff0c…

根据 IP 地址配置子网示例(下挂 hub 接不同 vlan 终端)

我们一般根据端口配置子网比较简单,但是如果换接口,就又要到交换机上重新配置端口所属 vlan 了,紧急情况下,还是比较耽误时间的。但如果根据IP地址配置 vlan,则可以插在交换机上任意端口,排障时比较节省时间…

部分PC制造商不会帮助英特尔第13/14代酷睿延保 对用户来说可能是个问题

早前英特尔已经宣布大部分第 13/14 代酷睿桌面处理器将可以获得延长保修服务,即后续使用出现非人为损坏的问题后,用户都可以联系英特尔换一颗新处理器。然而英特尔承担责任不代表对用户来说就高枕无忧,例如只有盒装版处理器才能直接联系英特尔…

MySQL数据库分区

文章目录 1. 分区的基本概念2. 分区的类型3. 在 MySQL 中实现分区3.1 创建分区表3.2 插入数据3.3 查询数据3.4 修改分区3.5 查看分区信息 4. 具体示例4.1 范围分区 (Range Partitioning)4.2 列表分区 (List Partitioning)4.3 哈希分区 (Hash Partitioning)4.4 键分区 (Key Part…

Win32注册表操作

注册表的概念 注册表是一个存储计算机配置信息的数据库,用于存储计算机上的硬件、安装的软件、系统设置以及用户账户配置等重要信息。对注册表的编辑不当可能会影响计算机的正常运行。应用程序可以调用API函数来对注册表进行增、删等操作。 注册表结构 运行Regedi…

【Redis 进阶】Redis 典型应用 —— 分布式锁

一、什么是分布式锁 在一个分布式的系统中,也会涉及到多个节点访问同一个公共资源的情况,此时就需要通过锁来做互斥控制, 避免出现类似于 “线程安全” 的问题。 而 Java 的 synchronized 或者 C 的 std::mutex,这样的锁都是只能在当前进程…

Embedding技术之Word Embedding

Word Embedding是什么? Word Embedding——词嵌入是将单词映射为数值向量,以捕捉单词间的语义和句法关系,为自然语言处理任务提供有效的特征表示。——自然语言处理——Word2Vec、GloVe、FastText。 Word Embedding属于静态向量&#xff0c…

深度学习入门(四):激活函数与LSTM

激活函数 激活函数在神经网络中扮演着至关重要的角色。它们的主要功能是引入非线性因素,这使得神经网络能够学习和近似任何非线性函数,从而处理复杂的数据模式和决策边界。如果没有激活函数,即使网络拥有很多层,其表达能力仍然只…