带你读《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;
相关文章
|
3月前
|
数据采集 机器学习/深度学习 存储
一文讲清数据清洗的十大常用方法
本文详解数据清洗十大常用方法与实战技巧,涵盖缺失值填补、重复值处理、异常值检测、数据标准化、文本清洗、数据脱敏等关键操作,助你高效提升数据质量,解决“脏乱差”问题。
一文讲清数据清洗的十大常用方法
|
7月前
|
存储 安全 物联网
RFID工地安全帽管理
基于RFID技术的工地安全帽管理系统,通过为每位工人配备带有唯一识别码的RFID安全帽,在出入口安装固定式读写器,实现人员进出自动感应、身份识别与数据统计。系统可实时追踪工人位置,强化危险区域安全管理,提高权限验证和考勤管理效率。同时,手持或便携式读写器支持临时检查,确保工地安全。该方案优化了人员调度,提升了应急响应能力,助力工地智能化、高效化管理,符合法规要求,保障工人生命安全。
|
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向量化 增强检索
1144 2
|
SQL 分布式计算 关系型数据库
实时计算 Flink版产品使用问题之在使用FlinkCDC与PostgreSQL进行集成时,该如何配置参数
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
实时计算 Flink版产品使用问题之在使用FlinkCDC与PostgreSQL进行集成时,该如何配置参数
|
Shell Linux
编写一个小脚本程序memusage.sh,根据Free命令的结果结算内存占用率
编写一个小脚本程序memusage.sh,根据Free命令的结果结算内存占用率
195 1
编写一个小脚本程序memusage.sh,根据Free命令的结果结算内存占用率
|
弹性计算 Linux 数据安全/隐私保护
阿里云esc体验
一个计算机应用技术专业学生的体验
阿里云esc体验
|
SQL 数据库
SQL Server中公用表表达式 CTE 递归的生成帮助数据,以及递归的典型应用
原文:SQL Server中公用表表达式 CTE 递归的生成帮助数据,以及递归的典型应用   本文出处:http://www.cnblogs.com/wy123/p/5960825.html   我们在做开发的时候,有时候会需要一些帮助数据,必须需要连续的数字,连续间隔的时间点,连续的季度日期...
1301 0
|
JavaScript
ExtJS 4 官方指南翻译:Tree组件
原文:http://docs.sencha.com/ext-js/4-0/#!/guide/tree 翻译:frank/sp42 转载请保留本页信息 树 Trees 树面板组件是在 ExtJS 里面最多彩缤纷的组件之一,用于显示层次状明显的数据来说十分适合。
1895 0

热门文章

最新文章