目录

一、简介

二、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的区别相关推荐

  1. 一文看懂-ElasticSearch全文搜索引擎

    一文看懂-ElasticSearch全文搜索引擎 一.ElasticSearch简介 1.1 什么是ElasticSearch ElasticSearch简称ES,其中Elastic 从名字里我们可以 ...

  2. ElasticSearch 全文搜索引擎的查询详解①(Ubuntu版 v6.6.2)

    ElasticSearch 全文搜索引擎的查询详解①(Ubuntu版 v6.6.2) 1. 前提 2. 轻量搜索 2.1 单条件查询 2.2 多条件查询 2.3 不指定属性查询(查询所有文档属性)-- ...

  3. Elasticsearch全文搜索引擎-PHP使用教程。

    1.声明依赖关系:         比方说,你的项目中需要一个php版的elasticsearch框架.为了将它添加到你的项目中(下载),你所需要做的就是创建一个 composer.json 文件,其 ...

  4. PHP使用Elasticsearch 全文搜索引擎的开发

    PHP基于elasticsearch全文搜索引擎的开发 1.概述: 全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选.Elastic ...

  5. ElasticSearch全文搜索引擎

    一.ElasticSearch简介 1.1 什么是ElasticSearch ElasticSearch简称ES,其中Elastic      从名字里我们可以知道,ES的特点就在于灵活的搜索,其实E ...

  6. Elasticsearch全文搜索引擎,从0到0.6

    目录 一,ES简介 1,es实现原理 2,基本结构 3,ELK 二.Linux搭建环境 1,jdk安装 2,安装Elasticsearch 3,启动es 4,启动es可能遇到的错误 4,在windon ...

  7. ElasticSearch——全文搜索引擎

    一.为什么需要全文搜索引擎? 首先先来了解一个概念,在我们生活中一般来说有两种数据:结构化数据.非结构化数据 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等. 非结构化数据: 非结构化 ...

  8. 关于Elasticsearch全文搜索引擎

    什么是Elasticsearch? 我们可以把它简称为ES,但是搜索它的资料时(例如百度)还是使用Elasticsearch进行搜索更准确, 这个软件不再是SpringCloud提供的,它也不针对微服 ...

  9. 关于es查询dsl的filter与must,term与match的区别

    [1]创建es7  索引 put localhost:9200/pdi_cust , 注意 PUB_CUST_LABEL 字段分词了. es7 不支持type ,所以 无需指定type. { &quo ...

  10. ElasticSearch 全文搜索引擎

    一.ElasticSearch 简介 1.什么是 ElasticSearch? Elaticsearch,简称为es, es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储.检索数据:本身 ...

最新文章

  1. 微信开放平台手机APP支付
  2. visualVM 安装使用
  3. Linux 查看进程在哪个CPU上运行
  4. Scala _07trait特性
  5. Python __getattr__和__setattr__方法介绍
  6. registry :分支操作值Archive有什么用?
  7. 【grafana】grafana 添加 MySQL 本地无法连接
  8. VR来了,科技的各行各业要如何做好准备?
  9. ping 代理_linux命令行代理神器-proxychains
  10. VirtualBox扩容教程
  11. 第二次作业:微博案例分析
  12. 前端构建工具---parcel基础打包应用示例
  13. java isreachable_java-奇数InetAddress.isReachable()问题
  14. 【Office】Office小技巧
  15. 数字孪生与元宇宙:数字化科技的双向融合之路
  16. 验证是否正确迁出CESM2
  17. 论文写作——如图所示
  18. Linux使用Shell定时清理日志文件
  19. EIA/TIA 568国际综合布线标准
  20. 对抗神经网络算法 应用,对抗神经网络算法 英文

热门文章

  1. 线接触和面接触的区别_接触器是啥?跟继电器有啥区别,6大常见故障怎么处理...
  2. TensorFlow by Google CNN分类真实图片 Machine Learning Foundations: Ep #5 - Classifying real-world images
  3. java私有协议开发_priProto 基于netty5基于私有协议栈设计
  4. 388.文件的最长绝对路径
  5. 特征的标准化和归一化
  6. 公式推导以及仿真代码的修改 11-28
  7. How to do Regularization?(如何正则化)(1)----吴恩达机器学习
  8. 正则表达式 Java
  9. MongoDB 在windows shell环境下的基本操作和命令的使用示例(一)
  10. Cobalt Strike参数详解