ElasticSearch全文搜索引擎之term和match的区别
目录
一、简介
二、term精确匹配
三、match模糊匹配
三、总结
一、简介
在elasticsearch中,查询主要使用到两个:term和match,本篇文章将总结一下两者的区别。
- term:代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词解析,直接对搜索词进行查找;
- match:代表模糊匹配,搜索前会对搜索词进行分词解析,然后按搜索词匹配查找;
一般模糊查找的时候,多用match,而精确查找时可以使用term。
二、term精确匹配
term查询是直接通过倒排索引指定的词条进行查找的,所以,很显然,term查询效率肯定比match要高。
首先创建一个索引member,并插入几条测试数据,相关命令如下:
PUT /member/info/1
{"name": "张三","age": 20
}PUT /member/info/2
{"name": "张无忌","age": 50
}PUT /member/info/3
{"name": "李四","age": 30
}
插入完成,观察索引里面的数据,如下图所示:
- 查询name中精确匹配"张"的数据
GET /member/info/_search
{"query": {"term": {"name": "张"}}
}
由上图可见,两条数据都能查询出来,只要name里包含"张"关键字的数据都查出来了 。
如果我们只想精确匹配"张三"这个词,来看看下面的例子。
- 查询name中精确匹配"张三"的数据
GET /member/info/_search
{"query": {"term": {"name": "张三"}}
}
我们发现,查询出来显示无数据,从概念上看,term属于精确匹配,只能查单个词。
如果我们想通过term匹配多个词的话,可以使用terms
来实现:
GET /member/info/_search
{"query": {"terms": {"name": ["张","三"]}}
}
可以看到,两条数据都成功返回,因为terms里的[ ]
多个搜索词之间是or(或者)关系,只要满足其中一个词即可。
如果我们想要同时满足两个词精确匹配的话,就得使用bool的must来做,如下:
GET /member/info/_search
{"query": {"bool": {"must": [{"term": {"name": "张"}},{"term": {"name": "三"}}]}}
}
可以看到,此时只会返回一条满足条件的记录。
由于前面我们创建索引库member时并没有指定字段的类型,都是es默认生成的类型。
可以看到,默认生成的name字段是text类型。
下面我们看看是如何进行分词处理的?
GET member/_analyze
{"text" : "张三"
}
分析出来的为"张"和"三
"的两个词,而term
只能完完整整的匹配上面的词,不做任何改变的匹配。
扩展: 两种数据类型:text和keyword
- text:查询时会进行分词解析;
- keyword:keyword类型的词不会被分词器进行解析,直接作为整体进行查询;
下面我们通过简单的示例说明一下text和keyword的区别。我们先创建一个test索引库:
PUT /test
{"mappings": {"properties": {"name": {"type": "text"},"desc": {"type": "keyword"}}}
}
下面我们插入几条测试数据:
PUT /test/_doc/1
{"name":"马士兵java name","desc": "马士兵java desc"
}PUT /test/_doc/2
{"name":"马士兵java name","desc": "马士兵java desc2"
}
查看test索引库信息,可以看到我们指定的mappings,如下图:
- 通过keyword类型的分词器进行解析
GET _analyze
{"analyzer": "keyword","text":"马士兵java name"
}
可以看到,使用keyword类型分词器时,搜索关键字并不会被分词器进行解析,直接作为一个整体词。
- 通过standard类型的分词器进行解析
GET _analyze
{"analyzer": "standard","text":"马士兵java name"
}
可以看到,text类型的话搜索关键字将会被拆分为一个一个词,而前面的keyword类型的话不会被拆分,会当做一个整体。
- 查询name字段中含有"马"的记录
GET test/_search
{"query": {"term": {"name": "马"}}
}
可以看到,因为name字段是text类型,查询时候会被分词器分析,所以两条记录都成功查询出来。
- 查询desc字段中含有"马士兵java desc"的记录
GET test/_search
{"query": {"term": {"desc": "马士兵java desc"}}
}
可以看到,只返回一条记录,原因是desc字段是keyword类型,查询时候不会被分词器进行解析,作为一个整体查询。
keyword类型的字段不会被分词器解析,text类型的字段会被分词拆分后才进行查询。
三、match模糊匹配
- 查询姓名中匹配含"张三"这个词的数据
GET member/info/_search
{"query": {"match": {"name": "张三"}}
}
通过上图,我们可以看到两条记录都被查询出来的,因为match进行搜索的时候,会先进行分词拆分,拆完后,再来匹配。
"张三"被拆分解析为"张"和"三"两个词,所以只要name字段中包含"张"或者"三"的数据都能够匹配上。
如果想 "张"和"三"同时匹配到的话,那么可以使用 match_phrase,来看下面的例子:
match_phrase
称为短语搜索,要求所有的分词必须同时出现在文档中,同时位置必须紧邻一致。
可以看到,此时只会匹配出一条满足条件的记录。
三、总结
本文主要介绍了es中常用的两种查询方式:term和match。
- term:代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词解析,直接对搜索词进行查找;
- match:代表模糊匹配,搜索前会对搜索词进行分词解析,然后按分词匹配查找;
- term主要用于精确搜索,match则主要用于模糊搜索;
- term精确搜索相较match模糊查询而言,效率较高;
同时总结了两种数据类型:text和keyword。
- text:查询时会进行分词解析;
- keyword:keyword类型的词不会被分词器进行解析,直接作为整体进行查询;
由于笔者水平有限,如文中有不对之处,还望指正,相互学习,一起进步!
ElasticSearch全文搜索引擎之term和match的区别相关推荐
- 一文看懂-ElasticSearch全文搜索引擎
一文看懂-ElasticSearch全文搜索引擎 一.ElasticSearch简介 1.1 什么是ElasticSearch ElasticSearch简称ES,其中Elastic 从名字里我们可以 ...
- ElasticSearch 全文搜索引擎的查询详解①(Ubuntu版 v6.6.2)
ElasticSearch 全文搜索引擎的查询详解①(Ubuntu版 v6.6.2) 1. 前提 2. 轻量搜索 2.1 单条件查询 2.2 多条件查询 2.3 不指定属性查询(查询所有文档属性)-- ...
- Elasticsearch全文搜索引擎-PHP使用教程。
1.声明依赖关系: 比方说,你的项目中需要一个php版的elasticsearch框架.为了将它添加到你的项目中(下载),你所需要做的就是创建一个 composer.json 文件,其 ...
- PHP使用Elasticsearch 全文搜索引擎的开发
PHP基于elasticsearch全文搜索引擎的开发 1.概述: 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选.Elastic ...
- ElasticSearch全文搜索引擎
一.ElasticSearch简介 1.1 什么是ElasticSearch ElasticSearch简称ES,其中Elastic 从名字里我们可以知道,ES的特点就在于灵活的搜索,其实E ...
- Elasticsearch全文搜索引擎,从0到0.6
目录 一,ES简介 1,es实现原理 2,基本结构 3,ELK 二.Linux搭建环境 1,jdk安装 2,安装Elasticsearch 3,启动es 4,启动es可能遇到的错误 4,在windon ...
- ElasticSearch——全文搜索引擎
一.为什么需要全文搜索引擎? 首先先来了解一个概念,在我们生活中一般来说有两种数据:结构化数据.非结构化数据 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等. 非结构化数据: 非结构化 ...
- 关于Elasticsearch全文搜索引擎
什么是Elasticsearch? 我们可以把它简称为ES,但是搜索它的资料时(例如百度)还是使用Elasticsearch进行搜索更准确, 这个软件不再是SpringCloud提供的,它也不针对微服 ...
- 关于es查询dsl的filter与must,term与match的区别
[1]创建es7 索引 put localhost:9200/pdi_cust , 注意 PUB_CUST_LABEL 字段分词了. es7 不支持type ,所以 无需指定type. { &quo ...
- ElasticSearch 全文搜索引擎
一.ElasticSearch 简介 1.什么是 ElasticSearch? Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储.检索数据:本身 ...
最新文章
- 微信开放平台手机APP支付
- visualVM 安装使用
- Linux 查看进程在哪个CPU上运行
- Scala _07trait特性
- Python __getattr__和__setattr__方法介绍
- registry :分支操作值Archive有什么用?
- 【grafana】grafana 添加 MySQL 本地无法连接
- VR来了,科技的各行各业要如何做好准备?
- ping 代理_linux命令行代理神器-proxychains
- VirtualBox扩容教程
- 第二次作业:微博案例分析
- 前端构建工具---parcel基础打包应用示例
- java isreachable_java-奇数InetAddress.isReachable()问题
- 【Office】Office小技巧
- 数字孪生与元宇宙:数字化科技的双向融合之路
- 验证是否正确迁出CESM2
- 论文写作——如图所示
- Linux使用Shell定时清理日志文件
- EIA/TIA 568国际综合布线标准
- 对抗神经网络算法 应用,对抗神经网络算法 英文
热门文章
- 线接触和面接触的区别_接触器是啥?跟继电器有啥区别,6大常见故障怎么处理...
- TensorFlow by Google CNN分类真实图片 Machine Learning Foundations: Ep #5 - Classifying real-world images
- java私有协议开发_priProto 基于netty5基于私有协议栈设计
- 388.文件的最长绝对路径
- 特征的标准化和归一化
- 公式推导以及仿真代码的修改 11-28
- How to do Regularization?(如何正则化)(1)----吴恩达机器学习
- 正则表达式 Java
- MongoDB 在windows shell环境下的基本操作和命令的使用示例(一)
- Cobalt Strike参数详解