说说Elasticsearch拼写纠错是如何实现的?

大家好,我是锋哥。今天分享关于【说说Elasticsearch拼写纠错是如何实现的?】面试题。希望对大家有帮助;

说说Elasticsearch拼写纠错是如何实现的?

1000道 互联网大厂Java工程师 精选面试题-Java资源分享网

在 Elasticsearch 中,拼写纠错(也叫做 自动纠错拼写建议)可以通过几种不同的技术来实现。主要的两种实现方法是 fuzzy 查询suggest 功能。下面是几种常用的实现方法及其原理。

1. Fuzzy 查询

fuzzy 查询是一种通过匹配“模糊”文本的查询方法,用于容忍拼写错误和输入的不精确。它基于 编辑距离(Levenshtein Distance)算法,编辑距离衡量将一个单词转换为另一个单词所需的最小操作次数(插入、删除或替换字符)。

通过 fuzzy 查询,Elasticsearch 可以容忍一定数量的拼写错误,甚至对于不完全匹配的词也能找到最接近的匹配项。

示例:

{
  "query": {
    "match": {
      "title": {
        "query": "elasticsearchh",  // 错误拼写
        "fuzziness": "AUTO"        // 自动计算模糊度
      }
    }
  }
}
  • fuzziness: 定义了允许的最大编辑距离(模糊度)。可以是一个整数值(例如 12),或者使用 "AUTO",让 Elasticsearch 自动计算。

  • prefix_length: 指定前缀的最小长度,前缀部分不能模糊匹配。

Elasticsearch 会根据模糊匹配算法,寻找与 "elasticsearchh" 最接近的文档。如果模糊度设置为 "AUTO",系统会根据查询的长度自动选择最合适的编辑距离。

2. Completion Suggester(完成建议器)

completion suggester 是 Elasticsearch 中专门用于提供自动完成建议和拼写纠错的功能。它通常用于前端实现输入提示、自动补全或纠错。

完成建议器会基于一个索引进行实时查询,提供高效的搜索建议,常用于输入框中的建议列表,能根据用户输入的部分内容提供候选词。

  • 创建一个 completion 类型字段:
PUT /my_index/_mapping
{
  "properties": {
    "suggest": {
      "type": "completion"
    }
  }
}
  • 插入数据:
POST /my_index/_doc/1
{
  "suggest": {
    "input": ["elasticsearch", "search engine", "search"]
  }
}
  • 查询建议:
POST /my_index/_search
{
  "suggest": {
    "text": "elast",
    "completion": {
      "field": "suggest",
      "size": 3
    }
  }
}

在上面的例子中,用户输入 "elast" 时,Elasticsearch 会返回与 "elasticsearch" 最接近的词作为建议。

3. Term Vectors + Custom Script

另一种拼写纠错的方式是使用 Term Vectors,它存储了每个文档中各个词项的统计信息(如词频、位置等)。你可以通过这些信息结合 自定义脚本,手动实现拼写纠错机制。

这种方式通常需要额外的计算来分析词频和拼写误差,但它提供了很大的灵活性,可以根据实际需求调整拼写纠错的规则和逻辑。

4. Edgengram 或 Ngram Tokenizer

为了实现拼写纠错和自动完成功能,可以使用 Edge NgramNgram 分词器,它们在分词时会从单词的不同位置生成子串,这些子串在用户输入部分匹配时会提供更好的候选词。

  • Edge Ngram 会从词的前缀开始生成子串。常用于前缀自动补全(例如输入框自动补全)。
  • Ngram 会从词的各个位置生成子串,适用于全词匹配,但可能会产生更多的倒排索引。

示例:

PUT /my_index
{
  "settings": {
    "analysis": {
      "tokenizer": {
        "edge_ngram_tokenizer": {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 25
        }
      },
      "filter": {
        "lowercase": {
          "type": "lowercase"
        }
      },
      "analyzer": {
        "edge_ngram_analyzer": {
          "type": "custom",
          "tokenizer": "edge_ngram_tokenizer",
          "filter": ["lowercase"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "suggest": {
        "type": "text",
        "analyzer": "edge_ngram_analyzer"
      }
    }
  }
}

上述配置会基于用户输入的前缀(例如“elas”)生成“e”,“el”,“ela”,“elas”等多个子串,进而实现高效的拼写纠错和自动完成功能。

5. Spellcheck(拼写检查)

虽然 Elasticsearch 本身并没有内建的专门拼写检查功能(像某些传统拼写检查工具一样),但你可以使用上述 fuzzy 查询、completion suggester 或结合外部拼写检查库(例如 Hunspell)来补充拼写纠错的功能。你可以通过编写定制化的插件来整合外部拼写检查引擎。

总结

Elasticsearch 的拼写纠错通常通过以下方式实现:

  1. Fuzzy 查询:通过模糊匹配容忍拼写错误,基于编辑距离来进行查询。
  2. Completion Suggester:为自动完成和拼写建议提供快速的候选项查询,适用于搜索建议和实时补全。
  3. Edge Ngram 或 Ngram 分词器:生成词的前缀或子串,支持拼写纠错和自动完成。
  4. Term Vectors 和自定义脚本:结合文档的词频和位置统计信息,手动实现拼写纠错。

这些技术可以单独使用,也可以组合使用,以实现高效、准确的拼写纠错和搜索建议功能。

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

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

相关文章

【Leecode】Leecode刷题之路第62天之不同路径

题目出处 62-不同路径-题目出处 题目描述 个人解法 思路: todo代码示例:(Java) todo复杂度分析 todo官方解法 62-不同路径-官方解法 方法1:动态规划 思路: 代码示例:(Java&…

Windows修复SSL/TLS协议信息泄露漏洞(CVE-2016-2183) --亲测

漏洞说明: 打开链接:https://docs.microsoft.com/zh-cn/troubleshoot/windows-server/windows-security/restrict-cryptographic-algorithms-protocols-schannel 可以看到: 找到:应通过配置密码套件顺序来控制 TLS/SSL 密码 我们…

第六届国际科技创新(IAECST 2024)暨第四届物流系统与交通运输(LSTT 2024)

重要信息 会议官网:www.lstt.org 大会时间:2024年12月6-8日 大会地点:中国-广州 简介 第六届国际科技创新暨第四届物流系统与交通运输国际(LSTT 2024)将于2024年12月6-8日在广州举办,这是一个集中探讨…

ArcGIS 软件中路网数据的制作

内容导读 路网数据是进行网络分析的基础,它是建立网络数据集的数据来源。 本文我们以OSM路网数据为例,详细介绍OSM路网数据从下载,到数据处理,添加属性,完成符合网络分析的网络数据集的全部过程。 01 数据获取 比较…

【0346】Postgres内核 Startup Process 通过 signal 与 postmaster 交互实现 (5)

1. Startup Process 进程 postmaster 初始化过程中, 在进入 ServerLoop() 函数之前,会先通过调用 StartChildProcess() 函数来开启辅助进程,这些进程的目的主要用来完成数据库的 XLOG 相关处理。 如: 核实 pg_wal 和 pg_wal/archive_status 文件是否存在Postgres先前是否发…

PYNQ 框架 - OV5640驱动 + Linux 驱动分析

目录 1. 简介 1.1 博文要点 1.2 V4L2 2. 极简 Char 驱动 2.1 源码 2.2 Makefile 2.3 加载驱动 2.4 设备文件 2.5 测试驱动程序 2.6 卸载驱动程序 2.7 自动创建设备文件 2.8 日志等级 3. 极简 V4L2 驱动 3.1 源码 3.2 Makefile 3.3 设备节点类型 3.4 测试 V4L2…

RNN详解及其实现

目录 概述为什么需要 RNN?RNN 理解及其简单实现RNN 完成文本分类任务RNN 存在的问题 概述 提及 RNN,绝大部分人都知道他是一个用于序列任务的神经网络,会提及他保存了时序信息,但是,为什么需要考虑时序的信息&#xf…

Redis开发03:常见的Redis命令

1.输入以下命令,启动redis。 sudo service redis-server start 如果你是直接安装在WSL的,搜索栏搜索Ubuntu或者点击左下角Windows图表找到U那一栏,直接打开Ubentu,输入账密后,输入“sudo service redis-server start”…

【webrtc】 mediasoup中m77的IntervalBudget及其在AlrDetector的应用

IntervalBudget 用于带宽控制和流量整形 mediasoup中m77 代码的IntervalBudget ,版本比较老IntervalBudget 在特定时间间隔内的比特预算管理,从而实现带宽控制和流量整形。 一。 pacedsender 执行周期: 下一次执行的时间的动态可变的 int64_t PacedSender::TimeUntilNextPr…

Docker for Everyone Plus——No Enough Privilege

直接告诉我们flag在/flag中,访问第一小题: sudo -l查看允许提权执行的命令: 发现有image load命令 题目指明了有rz命令,可以用ZMODEM接收文件,看到一些write up说可以用XShell、MobaXterm、Tabby Terminal等软件连接上…

SpringMVC工作原理【流程图+文字详解SpringMVC工作原理】

SpringMVC工作原理 前端控制器:DispactherServlet处理器映射器:HandlerMapping处理器适配器:HandlerAdapter处理器:Handler,视图解析器:ViewResolver视图:View 首先用户通过浏览器发起HTTP请求…

网络安全 社会工程学 敏感信息搜集 密码心理学攻击 密码字典生成

网络安全 社会工程学 敏感信息搜集 密码心理学攻击 理解社会工程学的概念掌握获取敏感信息的方法提高自我信息保护的意识和方法理解密码心理学的概念理解密码特征分析掌握黑客猜解密码的切入方法掌握如何提高密码强壮性 敏感信息搜集 「注」由于对实验环境的限制,…

【机器学习】机器学习的基本分类-监督学习-逻辑回归-对数似然损失函数(Log-Likelihood Loss Function)

对数似然损失函数(Log-Likelihood Loss Function) 对数似然损失函数是机器学习和统计学中广泛使用的一种损失函数,特别是在分类问题(例如逻辑回归、神经网络)中应用最为广泛。它基于最大似然估计原理,通过…

SQL基础入门 —— SQL概述

目录 1. 什么是SQL及其应用场景 SQL的应用场景 2. SQL数据库与NoSQL数据库的区别 2.1 数据模型 2.2 查询语言 2.3 扩展性 2.4 一致性与事务 2.5 使用场景 2.6 性能与扩展性 总结 3. 常见的SQL数据库管理系统(MySQL, PostgreSQL, SQLite等) 3.…

力扣--LCR 149.彩灯装饰记录I

题目 代码 /** Definition for a binary tree node. public class TreeNode { int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val val;this.left left;this.right ri…

Admin.NET框架使用宝塔面板部署步骤

文章目录 Admin.NET框架使用宝塔面板部署步骤🎁框架介绍部署步骤1.Centos7 部署宝塔面板2.部署Admin.NET后端3.部署前端Web4.访问前端页面 Admin.NET框架使用宝塔面板部署步骤 🎁框架介绍 Admin.NET 是基于 .NET6 (Furion/SqlSugar) 实现的通用权限开发…

软通动力携子公司鸿湖万联、软通教育助阵首届鸿蒙生态大会成功举办

11月23日中国深圳,首届鸿蒙生态大会上,软通动力及软通动力子公司鸿湖万联作为全球智慧物联网联盟(GIIC)理事单位、鸿蒙生态服务(深圳)有限公司战略合作伙伴,联合软通教育深度参与了大会多项重磅…

利用若依代码生成器实现课程管理模块开发

目录 前言1. 环境准备1.1 数据库表设计与导入 2. 使用若依代码生成器生成模块代码2.1 导入数据库表2.2 配置生成规则2.2.1 基本信息配置2.2.2 字段信息配置2.2.3 生成信息配置 3. 下载与集成生成代码3.1 解压与集成3.2 启动项目并验证 4. 优化与扩展4.1 前端优化4.2 后端扩展 结…

MySQL Linux 离线安装

下载 进入官网,下载对应的需要MySQL版本,这里是历史版本。 官网 选择第一个MySQL Community Sever社区版,因为这个是免费的。 选择需要的对应版本: 安装 1.将下载好的安装包上传到服务器端 使用FinalShell 客户端连接服务器 …

Milvus 2.5:全文检索上线,标量过滤提速,易用性再突破!

01. 概览 我们很高兴为大家带来 Milvus 2.5 最新版本的介绍。 在 Milvus 2.5 里,最重要的一个更新是我们带来了“全新”的全文检索能力,之所以说“全新”主要是基于以下两点: 第一,对于全文检索基于的 BM25 算法,我们采…