大家好,我是Edison。

上一篇:Elastic学习之旅 (7) 聚合分析

相信很多童鞋和我一样,有点傻傻分不清Term查询和全文查询的区别,那么今天我们就来一起梳理一下。

基于Term的查询

Term(词项)是ES中表达语义的最小单位,搜索和利用统计语言模型进行自然语言处理都需要处理Term。

ES中Term Query包含了:

Term Query / Range Query / Exist Query / Prefix Query / Wildcard Query

ES中Term的特点:

特点1:在ES中,Term查询对输入不做分词。换句话说,它会将输入作为一个整体,在倒排索引中查找准确的词项,并且使用相关度算分公式为每个包含该词项的文档进行相关度算分 - 例如“Apple Store”。

可能上面有点难理解,现在我们通过一个实例来理解。

首先,我们先插入几条示例数据:

POST /products/_bulk
{ "index":{"_id":1}}
{ "productID": "XHDK-A-1293-#fJ3", "desc":"iPhone"}
{ "index":{"_id":2}}
{ "productID": "KDKE-B-9947-#kL5", "desc":"iPad"}
{ "index":{"_id":3}}
{ "productID": "J0DL-X-1937-#pV7", "desc":"MBP"}

然后,我们通过以下Term Query查询desc为iPhone的记录:

POST /products/_search
{
"query":{
"term": {
"desc": {
"value": "iPhone"
}
}
}
}

当你执行这条查询后,你会发现,ES居然没有查到这条记录,明明我们刚刚插入的就是它啊!

别急,这恰恰是因为Term查询不对输入做分词,会将输入作为一个整体,进而导致我们搜索不到。
我们进一步将上面的查询改为以下方式就可以查询到记录:将iPhone改为全小写的iphone即可。

POST /products/_search
{
"query":{
"term": {
"desc": {
"value": "iphone"
}
}
}
}

同时,如果我们想实现一个精确匹配,我们可以使用term的keyword关键字来实现,如下查询所示:精确匹配一个productID。这也说明,在ES中通过keyword关键字查询,它也不会做分词处理。

POST /products/_search
{
"query":{
"term": {
"productID.keyword": {
"value": "XHDK-A-1293-#fJ3"
}
}
}
}

我们还会发现,Term查询会返回一个算分:0.9808292,代表匹配的精准度。

特点2:可以使用Constant Score将查询转换成一个Filtering,避免算分,并利用缓存,提高性能。

刚刚提到ES会在倒排索引中进行相关性算分,这在一定程度上会带来一些查询上的开销。我们可以通过ConstantScore将Query转成Filter,来避免相关性算分的开销,还可以有效利用缓存,提高查询的效率!

POST /products/_search
{
"explain": true,
"query": {
"constant_score": {
"filter": {
"term": {
"productID.keyword": {
"value": "XHDK-A-1293-#fJ3"
}
}
}
}
}
}

查询结果显示也可以证明它会跳过算分步骤:

基于全文的查询

基于全文的查询,ES提供了以下Query(我们在第6篇Query DSL中学习的就是全文查询):

Match Query / Match Phrase Query / Query String Query

基于全文的查询具有以下的特点:

特点1:索引和搜索时都会进行分词,查询字符串先传到一个合适的分词器,然后生成一个待查询的词项列表。

特点2:查询会对每个词项进行底层的查询,再将结果进行合并,还会为每个文档生成一个算分。

针对这两个特点,我们通过一个示例来串一下:

例如,查询“Matrix reloaded”,会查到包括Matrix或者reload的所有结果。

首先,构建一个Match Query:

POST /movies/_search
{
"query": {
"match": {
"title": {
"query": "Matrix reloaded"
}
}
}
}

ES会返回title字段中包括Matrix 或者 reloaded的所有记录:

其次,如果你希望查询title字段中同时包含Matrix reloaded,那你可以修改默认的operator为AND来提高精准度:

POST /movies/_search
{
"profile": "true",
"query": {
"match": {
"title": {
"query": "Matrix reloaded",
"operator": "AND"
}
}
}
}

然后,如果你希望查询的是只要出现Matrix 和 reloaed,其中间可以间隔一些单词,那么你也可以使用match phrase 和 slop参数设置分词出现的最大间隔距离:

POST /movies/_search
{
"profile": "true",
"query": {
"match_phrase": {
"title": {
"query": "Matrix reloaded",
"slop": 1
}
}
}
}

最后,这个基于全文的查询在ES中的基本查询过程如下所示:

小结

本篇,我们了解了ElasticSearch的Term和全文查询的基本概念及其特点,利用这些特点在指定的场景会有是事半功倍的效果!

参考资料

极客时间,阮一鸣,《ElasticSearch核心技术与实战

作者:周旭龙

出处:https://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

Elastic学习之旅 (8) 深入词项和全文搜索的更多相关文章

  1. ElasticStack学习(九):深入ElasticSearch搜索之词项、全文本、结构化搜索及相关性算分

    一.基于词项与全文的搜索 1.词项 Term(词项)是表达语意的最小单位,搜索和利用统计语言模型进行自然语言处理都需要处理Term. Term的使用说明: 1)Term Level Query:Ter ...

  2. web前端学习之旅笔记01--HTML

    web前端学习之旅笔记01--HTML HTML最容易上手,但也易忘,实际开发中有时需要查阅官方文档,小伙伴们别忘了哟! HTML 教程 (w3school.com.cn) HTML是网页的骨架负责页 ...

  3. WCF学习之旅—第三个示例之四(三十)

           上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九)   ...

  4. WCF学习之旅—第三个示例之二(二十八)

    上接WCF学习之旅—第三个示例之一(二十七) 五.在项目BookMgr.Model创建实体类数据 第一步,安装Entity Framework 1)  使用NuGet下载最新版的Entity Fram ...

  5. WCF学习之旅—第三个示例之三(二十九)

    上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) 在上一篇文章中我们创建了实体对象与接口协定,在这一篇文章中我们来学习如何创建WCF的服务端代码.具体步骤见下面. ...

  6. WCF学习之旅—WCF服务部署到IIS7.5(九)

    上接   WCF学习之旅—WCF寄宿前的准备(八) 四.WCF服务部署到IIS7.5 我们把WCF寄宿在IIS之上,在IIS中宿主一个服务的主要优点是在发生客户端请求时宿主进程会被自动启动,并且你可以 ...

  7. WCF学习之旅—WCF服务的WAS寄宿(十二)

    上接    WCF学习之旅—WCF服务部署到IIS7.5(九) WCF学习之旅—WCF服务部署到应用程序(十) WCF学习之旅—WCF服务的Windows 服务程序寄宿(十一) 八.WAS宿主 IIS ...

  8. WCF学习之旅—WCF第二个示例(五)

    二.WCF服务端应用程序 第一步,创建WCF服务应用程序项目 打开Visual Studio 2015,在菜单上点击文件—>新建—>项目—>WCF服务应用程序.在弹出界面的“名称”对 ...

  9. WCF学习之旅—WCF第二个示例(七)

    三.创建客户端应用程序 若要创建客户端应用程序,你将另外添加一个项目,添加对该项目的服务引用,配置数据源,并创建一个用户界面以显示服务中的数据. 在第一个步骤中,你将 Windows 窗体项目添加到解 ...

  10. WCF学习之旅—WCF第二个示例(六)

    第五步,创建数据服务 在“解决方案资源管理器”中,使用鼠标左键选中“SCF.WcfService”项目,然后在菜单栏上,依次选择“项目”.“添加新项”. 在“添加新项”对话框中,选择“Web”节点,然 ...

随机推荐

  1. 分布式任务调度系统 xxl-job

    微服务难不难,不难!无非就是一个消费方,一个生产方,一个注册中心,然后就是实现一些微服务,其实微服务的难点在于治理,给你一堆 微服务,如何来管理?这就有很多方面了,比如容器化,服务间通信,服务上下线发 ...

  2. linux服务器运行java项目, 监控查看内存、储存空间和cpu占用率

    服务器部署方式为tomcat中运行war包的方式, 有一次重新部署时候发现报异常堆栈溢出了. 想要定位到某个war包中通过学习整理出此篇文章以作记录笔记. 关于远程调试, 可以本地对线上代码debug ...

  3. 康谋分享 | 3DGS:革新自动驾驶仿真场景重建的关键技术

    登录后复制 随着自动驾驶技术的迅猛发展,构建高保真.动态的仿真场景成为了行业的迫切需求.传统的三维重建方法在处理复杂场景时常常面临效率和精度的挑战.在此背景下,3D高斯点阵渲染(3DGS)技术应运而生 ...

  4. OpenEuler22.03源码编译安装nginx1.24.0

    一.环境说明 操作系统版本:OpenEuler22.03 SP2 LTS Nginx版本:1.24.0 安装位置:/app/nginx Selinux配置:关闭或设置为permissive 二.Ngi ...

  5. kubernetes dashboard web控制台调研

    背景 kubernetes 是目前最流行的容器化系统,管理的方式一般都是最基础的kubectl命令客户端进行管理,但是对与一些没有基础的研发人员并不是很友好,所以我们需要一些web控制台,类似于云厂商 ...

  6. springboot分页查询并行优化实践

    --基于异步优化与 MyBatis-Plus 分页插件思想的实践 适用场景 数据量较大的单表分页查询 较复杂的多表关联查询,包含group by等无法进行count优化较耗时的分页查询 技术栈 核心框 ...

  7. STM32操作GPIO外设(点亮LED灯)的两种方式——使用官方库函数或直接操作寄存器

    STM32操作外设(点亮LED灯)的两种方式 准备工作: 硬件gec6818开发板.搭载stm32f407zet6芯片 keil项目模板,准备好官方库函数 官方提供的<STM32f407数据手册 ...

  8. HttpServletRequest相关

    简介 获取客户端请求头及参数 获取提交给服务器的中文数据 简介 这个对象封装了客户端提交过来的一切数据. 获取客户端请求头及参数 package com.zhujunwei.httpServletRe ...

  9. AxureRP大型综合商场APP高保真交互原型图含VR试衣间停车缴费会员卡楼层导购

    大型综合商场APP AxureRP高保真交互原型图含VR试衣间停车缴费会员卡楼层导购,是一款完全原创的,关于大型综合商场的综合类应用APP,app中包含在线VR试衣间.楼层导购.会员码支付.在线停车缴 ...

  10. CANopen TPDO 配置详解:对象 1800h、1A00h 与实践指南

    CANopen TPDO 配置详解:对象 1800h.1A00h 与实践指南 目录 CANopen TPDO 配置详解:对象 1800h.1A00h 与实践指南 目录 引言 TPDO 通讯参数详解 ( ...