带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(3)

简介: 带你读《Elastic Stack 实战手册》之34:——3.4.2.17.3.全文搜索/精确搜索(3)


《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.3.全文搜索/精确搜索(2) https://developer.aliyun.com/article/1229942



二、基于词项和文本的查询

 

在解析 term 与 match 方法之前,我们先来理解两个在 ES 搜索查询中需要知道的两个概念 term 和 token 。

 

Term 代表文本中的一个单词。这是搜索单元,即搜索的最小元素(可以称之为词项)。

 

Token 文档进行索引后的最小元素,即语汇单元。Token 一般由词项(term)、位置(position)、偏移量(offset)、类型(type)、标志位(flags)和有效负载这些要素组成。

 

Token 的产生其实也是倒排索引产生的过程,是通过一定的解析规则将一段文档解析成一堆不可再拆分的词干的过程。而解析规则的制定主要依靠分词器的设置。

 

ES 搜索的最终过程就是 term 与 token 中词项进行比对的过程(我们在这里称它为词项比对)。

 

我们可以通过 _analyze API 体验到文档解析成 token 的过程。


POST _analyze
{
  "analyzer": "standard",
  "text": [
    "Quick Foxes Brown !"
  ]
}

返回结果:


{
  "tokens" : [
    {
      "token" : "quick",
      "start_offset" : 0,
      "end_offset" : 5,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "foxes",
      "start_offset" : 6,
      "end_offset" : 11,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "brown",
      "start_offset" : 12,
      "end_offset" : 17,
      "type" : "<ALPHANUM>",
      "position" : 2
    }
  ]
}

通过 API 可以看到,文档内容 "Quick Brown Foxes!" 经过 standard 分词器解析后形成

"quick","brown","foxes" 三个 token 。


也可以看到每个 token 的 offset、type 和 position 的属性,这些属性主要用于搜索过程中的相关性算分,算分内容在这里不进行详细介绍。

 

然后我们再看看 ES 中搜索与索引时的处理过程:


image.png



注意:搜索和索引的过程中,分词器可以选择不一样的,但并不推荐这么做(控制不好就会造成搜索结果的难以理解 )。

 

对于基于全文搜索(full text queries)和基于词项搜索(term-level queries)的定义主要如下:

 

l 基于词项的搜索:如 term 或 fuzzy 这样的底层查询不需要分词阶段,将被查询的内容直接作为词项,对相应字段进行词项匹配和相关性算分,得出匹配的查询结果。

l 基于全文的搜索:像 match 或 query_string 这样的查询是高层查询,根据字段的格式信息,特别是分词器的配置,形成词项列表。这个查询会对词项列表中的每个词项逐一执行底层的查询(比如 term 查询),再将结果合并,然后为每个文档生成一个最终的相关度评分。返回对应相关性文档结果。

 

这里基于词项和基于全文的分别在于,被查询的字符串是否会被分词。词项即 term,基于词项即将被查询的字符串作为一个 term 去查询。而基于全文,则将被查询的字符串作为一个 text文本,进分词成 term 后进行查询。

 

在实际使用中,对于复杂文本内容的查询,使用基于全文的搜索比基于词项的更加实用。比如之前使用 "term": {"full_text": "brown foxes"} 查询 "quick brown foxes!" 这个文本就失败了,"brown foxes" 这个查询内容更适合全文搜索,需要进行分词。

 

下面基于实例,来看下基于全文查询的实现过程:

 

首先,索引一些实验数据:


PUT full-text-query
POST full-text-query/_mapping
{"properties":{"title":{"type":"text"}}}
POST full-text-query/_bulk
{ "index": { "_id": 1 }}
{ "title": "The quick brown fox" }
{ "index": { "_id": 2 }}
{ "title": "The quick brown fox jumps over the lazy dog" }
{ "index": { "_id": 3 }}
{ "title": "The quick brown fox jumps over the quick dog" }
{ "index": { "_id": 4 }}
{ "title": "Brown fox brown dog" }

然后使用 match 查询进行全文搜索。


GET /full-text-query/_search
{
    "query": {
        "match": {
            "title": "QUICK!"
        }
    }
}

在这个过程中,ES 主要做了以下操作:

 

1、检查字段类型。这里字段类型是 text,使用默认的 standard 分词器。

2、解析被查询的字符串。将查询的字符串 QUICK! 传入 standard 分析器中,输出的结果是单个项 quick 。因为只有一个单词项,所以 match 查询执行的是单个底层 term 查询。

3、查找匹配文档。用 term 查询在倒排索引中查找 quick 然后获取一组包含该项的文档,本例的结果是文档:1、2 和 3 。

4、文档评分。用 term 查询计算每个文档相关度评分 _score 。根据相关性评分,文档 3 等分最高。

 

  {
        "_index" : "full-text-query",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 0.4425555,
        "_source" : {
          "title" : "The quick brown fox jumps over the quick dog"
        }
      },
      {
        "_index" : "full-text-query",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.423274,
        "_source" : {
          "title" : "The quick brown fox"
        }
      },
      {
        "_index" : "full-text-query",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.30818442,
        "_source" : {
          "title" : "The quick brown fox jumps over the lazy dog"
        }
      }

两者之间的比对如下图:


image.png



下面我们看一下这两类查询的具体使用方法

 


《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.17.Text analysis, settings 及 mappings——3.4.2.17.3.全文搜索/精确搜索(4) https://developer.aliyun.com/article/1229940

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
存储 运维 负载均衡
MFS详解(二)——MFS原理和架构
MFS详解(二)——MFS原理和架构
1013 0
|
人工智能 自然语言处理 文字识别
DeepMind首发游戏AI智能体SIMA:开启虚拟世界的智能探索之旅
【4月更文挑战第3天】DeepMind推出了SIMA,一种能在多个3D环境中执行语言指令的智能体,标志着AI在理解和互动虚拟世界上的进步。SIMA通过多样化的训练数据学习导航、操作、决策等技能,并结合预训练模型处理高维度输入输出。尽管在复杂任务上仍有提升空间,SIMA展现了正向迁移能力和潜力,为AI研究和未来机器人技术铺平道路。然而,仍需解决鲁棒性、可控性、评估方法及道德安全问题。
818 4
DeepMind首发游戏AI智能体SIMA:开启虚拟世界的智能探索之旅
|
10月前
|
数据采集 人工智能 分布式计算
只靠国产算力与开源数据,端侧模型预训练行不行?我们做到了全流程开源
鹏城实验室与清华联合发布全流程开源大模型“开元-2B”,基于国产算力实现高效端侧训练。涵盖数据、代码、训练框架与技术报告,推动开放AI生态发展。
718 1
|
10月前
|
负载均衡 应用服务中间件 Nacos
Nacos配置中心
本文详细介绍Nacos作为配置中心的实现原理与实战步骤,涵盖配置管理、热更新、共享配置优先级及集群搭建,帮助微服务应用实现配置动态化、高可用部署。
535 4
|
开发者 知识图谱
免费下载!《阿里工程师的自我修养》公开10位阿里大牛解决问题的思维方式
今天,阿里技术公布一波阿里P8、P9技术大牛的思维模型,将他们的思维模式呈现出来。你可以在阿里资深专家职业生涯的真切感悟中,找到应对危机的最佳方法。《阿里工程师的自我修养》现已正式公开,可免费下载阅读。
136799 1
免费下载!《阿里工程师的自我修养》公开10位阿里大牛解决问题的思维方式
|
7月前
|
弹性计算 人工智能 安全
在阿里云 ECS 上部署 OpenClaw:构建 7x24 小时在线 AI 助理
OpenClaw本地运行易受休眠、网络波动、性能干扰影响。推荐部署于阿里云ECS:24小时在线、环境隔离、弹性扩缩、网络稳定。配Nginx+认证保障安全,低成本即可打造私有AI中台,赋能舆情监控、服务器巡检、自动化测试等场景。
929 5
|
数据采集 机器学习/深度学习 存储
一文讲清数据清洗的十大常用方法
本文详解数据清洗十大常用方法与实战技巧,涵盖缺失值填补、重复值处理、异常值检测、数据标准化、文本清洗、数据脱敏等关键操作,助你高效提升数据质量,解决“脏乱差”问题。
2248 10
一文讲清数据清洗的十大常用方法
|
存储 数据库 索引
RAG检索质量差?这5种分块策略帮你解决70%的问题
RAG效果关键在于文档分块:固定、递归、语义、结构化与延迟分块各有优劣。合理选择能显著提升检索质量,减少幻觉,增强上下文理解,是构建高效RAG系统的核心环节。
1255 4
|
开发工具 开发者
HarmonyOS NEXT实战:播放视频
本教程介绍如何在HarmonyOS SDK中使用Video组件实现视频播放、暂停、结束、重置及跳转播放等功能,适用于教育类应用开发,提升视频交互体验。
565 1
|
JSON 数据格式
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
1966 2

热门文章

最新文章