Elasticsearch 全文检索 分词检索-Elasticsearch文章四

文章目录

  • 官方文档地址
  • refercence文档
  • 全文搜索体系
  • match
    • 简单查询
    • match 多词/分词
    • 单字段分词
    • match多个词的逻辑
    • 控制match的匹配精度
    • match_pharse_prefix分词前缀方式
    • match_bool_prefix
    • multi_match多字段匹配
  • query string类型
  • Interval类型
  • DSL查询之Term详解
  • 聚合查询之Bucket聚合详解
  • 聚合查询之Metric聚合详解
  • 聚合查询之Pipline聚合详解
  • 其他
  • 外传

官方文档地址

https://www.elastic.co/guide/en/enterprise-search/current/start.html

refercence文档

https://www.elastic.co/guide/en/elasticsearch/reference/7.17/query-dsl-match-query.html

全文搜索体系

Full text Query中,我们只需要把如下的那么多点分为3大类,你的体系能力会大大提升

在这里插入图片描述

很多api都可以查得到,我们只要大概知道有支持哪些功能

在这里插入图片描述

match

简单查询

GET visit_log/_search
{
  "query": { "match": {
    "serverHostName": "wei"
  }},
  "sort": [
    { "_id": "asc" }
  ],
  "from": 0,
  "size": 10
}

Elasticsearch 执行上面这个 match 查询的步骤是:
1. 检查字段类型 。
标题 title 字段是一个 string 类型( analyzed )已分析的全文字段,这意味着查询字符串本身也应该被分析。
1. 分析查询字符串 。
将查询的字符串 wei cui传入标准分析器中,输出的结果是单个项 wei。因为只有一个单词项,所以 match 查询执行的是单个底层 term 查询。
1. 查找匹配文档 。
用 term 查询在倒排索引中查找 wei然后获取一组包含该项的文档,本例的结果是文档:1、2 和 3 。
1. 为每个文档评分 。
用 term 查询计算每个文档相关度评分 _score ,这是种将词频(term frequency,即词 quick 在相关文档的 title 字段中出现的频率)和反向文档频率(inverse document frequency,即词 quick 在所有文档的 title 字段中出现的频率),以及字段的长度(即字段越短相关度越高)相结合的计算方式。

查询结果:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "visit_log",
        "_type" : "_doc",
        "_id" : "nUL9rokBpGsmR0pP0VSc",
        "_score" : null,
        "_source" : {
          "_class" : "org.lwd.microservice.boot.es.entity.VisitLog",
          "id" : 7,
          "tableName" : "VisitLog",
          "userLoginId" : 3,
          "serverIpAddress" : "127.0.0.1",
          "serverHostName" : "liu wei",
          "initialRequest" : "http://localhost:8023",
          "msgContent" : "test es add7",
          "createTime" : 1690446876000
        },
        "sort" : [
          "nUL9rokBpGsmR0pP0VSc"
        ]
      }
    ]
  }
}

match 多词/分词

单字段分词

查询字段包含wei cui两个词

GET visit_log/_search
{
  "query": { "match": {
    "serverHostName": "wei cui"
  }},
  "sort": [
    { "_id": "asc" }
  ],
  "from": 0,
  "size": 10
}


结果:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [
      {
        "_index" : "visit_log",
        "_type" : "_doc",
        "_id" : "TEL9rokBpGsmR0pPXFMo",
        "_score" : null,
        "_source" : {
          "_class" : "org.lwd.microservice.boot.es.entity.VisitLog",
          "id" : 5,
          "tableName" : "VisitLog",
          "userLoginId" : 3,
          "serverIpAddress" : "127.0.0.1",
          "serverHostName" : "wang cui",
          "initialRequest" : "http://localhost:8023",
          "msgContent" : "test es add6",
          "createTime" : 1690446876000
        },
        "sort" : [
          "TEL9rokBpGsmR0pPXFMo"
        ]
      },
      {
        "_index" : "visit_log",
        "_type" : "_doc",
        "_id" : "nUL9rokBpGsmR0pP0VSc",
        "_score" : null,
        "_source" : {
          "_class" : "org.lwd.microservice.boot.es.entity.VisitLog",
          "id" : 7,
          "tableName" : "VisitLog",
          "userLoginId" : 3,
          "serverIpAddress" : "127.0.0.1",
          "serverHostName" : "liu wei",
          "initialRequest" : "http://localhost:8023",
          "msgContent" : "test es add7",
          "createTime" : 1690446876000
        },
        "sort" : [
          "nUL9rokBpGsmR0pP0VSc"
        ]
      }
    ]
  }
}

因为 match 查询必须查找两个词( [“liu”,“wei”] ),它在内部实际上先执行两次 term 查询,然后将两次查询的结果合并作为最终结果输出。为了做到这点,它将两个 term 查询包入一个 bool 查询中,
所以上述查询的结果,和如下语句查询结果是等同的

GET /visit_log/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "serverHostName": "liu"
          }
        },
        {
          "term": {
            "serverHostName": "cui"
          }
        }
      ]
    }
  }
}

match多个词的逻辑

上面等同于should(任意一个满足),是因为 match还有一个operator参数,默认是or, 所以对应的是should。

GET /visit_log/_search
{
  "query": {
    "match": {
      "serverHostName": {
        "query": "wang cui",
        "operator": "or"
      }
    }
  }
}

多字段分词

GET /visit_log/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "serverHostName": "cui wei" }},
        { "match": { "msgContent": "add3 add4" }}
      ]
    }
  }
}

控制match的匹配精度

如果用户给定 3 个查询词,想查找至少包含其中 2 个的文档,该如何处理?将 operator 操作符参数设置成 and 或者 or 都是不合适的。
match 查询支持 minimum_should_match 最小匹配参数,这让我们可以指定必须匹配的词项数用来表示一个文档是否相关。我们可以将其设置为某个具体数字,更常用的做法是将其设置为一个百分数,因为我们无法控制用户搜索时输入的单词数量:

GET /visit_log/_search
{
  "query": {
    "match": {
      "serverHostName": {
        "query": "wang cui wangcui",
        "minimum_should_match": "75%"
      }
    }
  }
}

当然也等同于

GET /visit_log/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "serverHostName": "wang" }},
        { "match": { "serverHostName": "cui"   }},
        { "match": { "serverHostName": "wangcui"   }}
      ],
      "minimum_should_match": 2 
    }
  }
}

match_pharse_prefix分词前缀方式

那有没有可以查询出quick brown f的方式呢?ELasticSearch在match_phrase基础上提供了一种可以查最后一个词项是前缀的方法,这样就可以查询test es a了

GET /visit_log/_search
{
  "query": {
    "match_phrase_prefix": {
      "msgContent": {
        "query": "test es a"
      }
    }
  }
}


(ps: prefix的意思不是整个text的开始匹配,而是最后一个词项满足term的prefix查询而已)

match_bool_prefix

GET /visit_log/_search
{
  "query": {
    "match_bool_prefix": {
      "msgContent": {
        "query": "es test a"
      }
    }
  }
}

所以这样你就能理解,match_bool_prefix查询中的quick,brown,f是无序的。

multi_match多字段匹配

GET /visit_log/_search
{
  "query": {
    "multi_match" : {
      "query":    "add7 wang",
      "fields": [ "msgContent", "*HostName" ] 
    }
  }
}

结果:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 3,
      "relation" : "eq"
    },
    "max_score" : 1.7917595,
    "hits" : [
      {
        "_index" : "visit_log",
        "_type" : "_doc",
        "_id" : "nUL9rokBpGsmR0pP0VSc",
        "_score" : 1.7917595,
        "_source" : {
          "_class" : "org.lwd.microservice.boot.es.entity.VisitLog",
          "id" : 7,
          "tableName" : "VisitLog",
          "userLoginId" : 3,
          "serverIpAddress" : "127.0.0.1",
          "serverHostName" : "liu wei",
          "initialRequest" : "http://localhost:8023",
          "msgContent" : "test es add7",
          "createTime" : 1690446876000
        }
      },
      {
        "_index" : "visit_log",
        "_type" : "_doc",
        "_id" : "TEL9rokBpGsmR0pPXFMo",
        "_score" : 1.0800905,
        "_source" : {
          "_class" : "org.lwd.microservice.boot.es.entity.VisitLog",
          "id" : 5,
          "tableName" : "VisitLog",
          "userLoginId" : 3,
          "serverIpAddress" : "127.0.0.1",
          "serverHostName" : "wang cui",
          "initialRequest" : "http://localhost:8023",
          "msgContent" : "test es add6",
          "createTime" : 1690446876000
        }
      },
      {
        "_index" : "visit_log",
        "_type" : "_doc",
        "_id" : "6UL9rokBpGsmR0pPjVOS",
        "_score" : 1.0800905,
        "_source" : {
          "_class" : "org.lwd.microservice.boot.es.entity.VisitLog",
          "id" : 6,
          "tableName" : "VisitLog",
          "userLoginId" : 3,
          "serverIpAddress" : "127.0.0.1",
          "serverHostName" : "wang ting",
          "initialRequest" : "http://localhost:8023",
          "msgContent" : "test es add6",
          "createTime" : 1690446876000
        }
      }
    ]
  }
}

*表示前缀匹配字段。

query string类型

此查询使用语法根据运算符(例如AND或)来解析和拆分提供的查询字符串NOT。然后查询在返回匹配的文档之前独立分析每个拆分的文本。
可以使用该query_string查询创建一个复杂的搜索,其中包括通配符,跨多个字段的搜索等等。尽管用途广泛,但查询是严格的,如果查询字符串包含任何无效语法,则返回错误。
例如:


GET /visit_log/_search
{
  "query": {
    "query_string": {
      "query": "(wangcui) OR (add6)",
      "fields": [ "msgContent", "*HostName" ] 
    }
  }
}

Interval类型

Intervals是时间间隔的意思,本质上将多个规则按照顺序匹配。


GET /visit_log/_search
{
  "query": {
    "intervals" : {
      "msgContent" : {
        "all_of" : {
          "ordered" : true,
          "intervals" : [
            {
              "match" : {
                "query" : "liu",
                "max_gaps" : 0,
                "ordered" : true
              }
            },
            {
              "any_of" : {
                "intervals" : [
                  { "match" : { "query" : "es" } },
                  { "match" : { "query" : "add6" } }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

因为interval之间是可以组合的,所以它可以表现的很复杂

DSL查询之Term详解

自行查官方文档,有可能后边会出详解

聚合查询之Bucket聚合详解

自行查官方文档,有可能后边会出详解

聚合查询之Metric聚合详解

自行查官方文档,有可能后边会出详解

聚合查询之Pipline聚合详解

自行查官方文档,有可能后边会出详解

其他

外传

😜 原创不易,如若本文能够帮助到您的同学
🎉 支持我:关注我+点赞👍+收藏⭐️
📝 留言:探讨问题,看到立马回复
💬 格言:己所不欲勿施于人 扬帆起航、游历人生、永不言弃!🔥

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RTT(RT-Thread)线程管理(1.2W字详细讲解)

目录 RTT线程管理 线程管理特点 线程工作机制 线程控制块 线程属性 线程状态之间切换 线程相关操作 创建和删除线程 创建线程 删除线程 动态创建线程实例 启动线程 初始化和脱离线程 初始化线程 脱离线程 静态创建线程实例 线程辅助函数 获得当前线程 让出处…

【LeetCode】446. 等差数列划分II -- 子序列

题目链接 文章目录 1. 思路讲解1.1 dp表的创建1.2 状态转移方程1.3 使用哈希表找到k1.4 初始化1.5 返回值1.6 该题坑爹的一点 2. 代码编写 1. 思路讲解 我们要知道以某个位置为结尾的子序列的数量,可以通过它的以上一位置的为结尾的子序列的数量得知,也…

css3 hover border 流动效果

/* Hover 边线流动 */.hoverDrawLine {border: 0 !important;position: relative;border-radius: 5px;--border-color: #60daaa; } .hoverDrawLine::before, .hoverDrawLine::after {box-sizing: border-box;content: ;position: absolute;border: 2px solid transparent;borde…

Linux第八章之进程概念

一、冯诺依曼体系结构 关于冯诺依曼,必须强调几点: 这里的存储器指的是内存不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)外设(输入或输出设备)要输入或者输出数据,也只能写入内存或…

加强Web应用程序安全:防止SQL注入

数据库在Web应用程序中存储和组织数据时起着至关重要的作用,它是存储用户信息、内容和其他应用程序数据的中央存储库。而数据库实现了高效的数据检索、操作和管理,使Web应用程序能够向用户提供动态和个性化的内容。然而,数据库和网络应用程序…

SQL Developer中的Active Data Guard

这篇文章 Display Data Guard configuration in SQL Developer 中,用SQL Developer展示了多种ADG的拓扑。 今天自己也试了一下,还蛮简单的,其实最麻烦的部分在于搭建一个ADG环境。 假设我已有一个ADG环境,即最典型的环境&#x…

简要介绍 | 生成模型的演进:从自编码器(AE)到变分自编码器(VAE)和生成对抗网络(GAN),再到扩散模型

注1:本文系“简要介绍”系列之一,仅从概念上对生成模型(包括AE, VAE, GAN,以及扩散模型)进行非常简要的介绍,不适合用于深入和详细的了解。 生成模型的演进:从自编码器(AE)到变分自编码器(VAE)和生成对抗网络(GAN),再到扩散模型 一、背景介绍 生成模型在机器学习领域…

数据结构 | 线性数据结构——双端队列

目录 一、何谓双端队列 二、双端队列抽象数据类型 三、用Python实现双端队列 四、回文检测器 一、何谓双端队列 双端队列是与队列类似的有序集合。它有一前、一后两端,元素在其中保持自己的位置。与队列不同的是,双端队列对在哪一端添加和移除元素没…

Flask-SocketIO

一、简介: Flask-SocketIO使Flask应用程序可以实现客户端和服务器之间的低延迟双向通信。客户端应用程序可以使用 Javascript、Python、C、Java和Swift中的任何SocketIO客户端库或任何其他兼容客户端来建立与服务器的永久连接。 二、安装: pip instal…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(18)-Fiddler如何接口测试,妈妈再也不担心我不会接口测试了

1.简介 Fiddler最大的优势在于抓包,我们大部分使用的功能也在抓包的功能上,fiddler做接口测试也是非常方便的。 领导或者开发给你安排接口测试的工作任务,但是没有给你接口文档(由于开发周期没有时间出接口文档)&…

【13】STM32·HAL库-正点原子SYSTEM文件夹 | SysTick工作原理、寄存器介绍 | printf函数使用、重定向

目录 1.sys文件夹介绍(掌握)2.deley文件夹介绍(掌握)2.1deley文件夹函数简介2.2SysTick工作原理2.3SysTick寄存器介绍2.4delay_init()函数(F1)2.5delay_us()函数(F1)2.6delay_ms()函…

这次,常温超导能否变为现实?

关注科研和技术的朋友近几天应当都听到韩国研发常温超导材料的消息了,作为攻城狮的我自然也是非常感兴趣,经过一番思想斗争还是放下了手上的单片机,想要一看这个常温超导的究竟,毕竟印象之中之前已经搞过好几次乌龙了。常温超导要…

el-table点击表格某一行添加到URL参数,访问带参URL加载表格内容并滚动到选中行位置 [Vue3] [Element-plus 2.3]

写在最前 需求:有个表格列出了一些行数据,每个行数据点击后会加载出对应的详细数据,想要在点击了某一行后,能够将该点击反应到URL中,这样我复制这个URL发给其他人,他们打开时也能看到同样的行数据。 url会根…

ABB机器人RAPID编程常用指令介绍1

ABB机器人RAPID编程常用指令介绍1 1. 运动控制指令 AccSet 语法格式:AccSet Acc,Ramp; Acc:机器人加速度百分比(num),默认值为100,最小为20 Ramp:机器人加速度斜坡比例(num),默认值为100,最小为10 应用:当机器人运行速度改变时,对所产生的相应加速度进行限制,使…

[Docker]入门之docker-compose

一,Docker-compose简介 1,Docker-compose简介 Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层,分别是工程(project)&#xff0c…

C# 根据图片的EXIF自动调整图片方向

PropertyItems 代码 /// <summary>/// 根据图片exif调整方向/// </summary>/// <param name"img"></param>public void RotateImage(Bitmap img){var exif img.PropertyItems;byte orien 0;var item exif.Where(m > m.Id 274).ToArra…

Xilinx FPGA电源设计与注意事项

1 引言 随着半导体和芯片技术的飞速发展&#xff0c;现在的FPGA集成了越来越多的可配置逻辑资源、各种各样的外部总线接口以及丰富的内部RAM资源&#xff0c;使其在国防、医疗、消费电子等领域得到了越来越广泛的应用。当采用FPGA进行设计电路时&#xff0c;大多数FPGA对上电的…

html富文本编辑器

接了个单子&#xff0c;需要添加一个文章模块&#xff0c;一看用到的技术这么老&#xff0c;人傻了&#xff0c;纯html css js 。 在普通页面中 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"…

DAY01_Spring简介IOC、DI入门案例Bean基础配置Bean实例化Bean生命周期依赖注入(DI配置)

目录 一 Spring1 Spring简介1.1 为什么要学1.2 学什么1.3 怎么学 2 初识Spring2.1 Spring家族2.2 Spring发展史 3 Spring体系结构问题导入3.1 Spring Framework系统架构图3.2 Spring Framework课程学习路线 4 Spring核心概念问题导入4.1 目前我们代码存在的问题4.2 核心概念 二…

【计算机网络】408统考2014年题36

题目描述 【2014年题36】主机甲与主机乙之间使用后退N帧(GBN)协议传输数据&#xff0c;甲的发送窗口尺寸为1000&#xff0c;数据帧长为1000字节&#xff0c;信道带宽为100Mbps&#xff0c;乙每收到一个数据帧就立即利用一个短帧&#xff08;忽略其传输延迟&#xff09;进行确认…