需要更好的搜索?利用 Elasticsearch 分析器的简单功能

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

以下是 Relevant Search 的内容摘要。

Relevant Search 的第 4 章中,我们讨论了很多关于 Elasticsearch 分析器的内容。如果没有分析器,您的搜索引擎将是一个相当不智能的字符串比较系统,而不是一个智能、强大的搜索引擎。分析器是提供搜索引擎核心数据结构的文本处理管道,控制两个标记(基本上是单词)在搜索过程中是否匹配。

在本文中,我想激励您构建自己的分析器。如果你能掌握分析器,你就可以直接控制 Elasticsearch 内部看似智能的东西。这里没有代码,我希望您确切了解为什么要使用自定义分析器。我们几乎在每个搜索项目中都这样做,但我们发现许多开发人员对使用它们感到害怕。让我们更哲学地探讨为什么分析器可以让您对搜索引擎的排名行为进行巨大而精确的控制。

什么是分析仪?为什么我们需要它们?

搜索引擎的核心是一个高度优化但相当笨拙的匹配字符串的数据结构。它是如此严格和愚蠢,以至于它无法分辨 CAT cat 是相同的。对于搜索引擎内部的数据结构,这两个字符串是唯一的 UTF-8 字符数组,而不是同一个词的变体。 CAT (\x43\x41\x54) 和 cat(\x63\x61\x74) 不匹配,所以故事结束:搜索 CAT 无法找到包含 cat 的文档。

摘自 相关搜索 :如何将文档转换为索引到搜索引擎中的标记

没那么快说你的分析器 :) 分析器在搜索/更新那个愚蠢的数据结构之前将字符串转换为规范化的标记。例如,分析中的一个步骤可能是强制文本小写。这会将 CAT 的所有实例转换为 cat ,导致两个变体匹配,从而覆盖实际数据结构中固有的非智能。



其他形式的分析更针对特定语言。例如,词干提取用于将单词转换为词根形式。对于英语,搜索引擎的愚蠢数据结构无法分辨 running run 是一样的。然而,通过适当的英语词干提取, running 可能会转换为 run ,从而使它们能够匹配。从德语、汉语到冰岛语的其他语言当然有自己独特的规则来执行这些类型的操作(甚至确定什么构成一个词!)。

分析仪是终极力量!

好的,大声疾呼,所以只需选择适合您的语言的分析器并继续前进,对吧!没那么快。分析器实际上是搜索解决方案中的重要控制点。通过创建您自己的自定义分析器,您可以决定两个术语何时相等并且应该在该哑数据结构中匹配。您可以将任何文本片段转换为匹配的内容。或者走另一条路——确保两段文本都经过分析,这样它们肯定不会匹配。两者都可能是有效的选择,具体取决于应用程序。

例如,假设您正在为科幻迷构建搜索,并且您希望向他们展示讨论他们最喜欢的系列(星际迷航、星球大战等)中的角色、想法等的网页。用户搜索 Star Trek 和 Star Wars,希望返回与其主题相关的文档。这有点工作。但超级粉丝根本不需要在讨论中真正提及特许经营权。正在搜索的整个文档读起来像

皮卡德船长比汉索罗酷多了。当然,汉·索罗首先开枪,但皮卡德阻止了博格、托马拉克海军上将和一大群其他人。

您搜索“Star Trek AND St​​ar Wars”,但在任何地方都找不到!

啊,但是分析让你有机会使术语等价。您可以使用分析器的一种方法是整理一组同义词,表明突出人物与其特许经营权之间的关系。同义词是您可以添加到分析过程中的另一个步骤。例如,这是我们的示例同义词文件:


 Captain Picard => Star Trek
Han Solo => Star Wars
Ned Stark => Game of Thrones

好的,接下来您将创建一个仅包含同义词步骤的自定义分析器。现在,如果我们拿我们的句子进行分析:

皮卡德船长比汉索罗酷多了。

这将被转化为这些令牌

[星际迷航] [是] [方式] [更酷] [比] [星球大战]

当然,如果我们对英语进行词干提取、小写化和其他几个有用的步骤,我们可以得出

[星际迷航][正][路][酷][比][星战]

现在您对 star trek 搜索应该与某些东西相匹配!您现在可以撒更大的网。此外,随着文档中更多的名称、想法等与星际迷航系列中的内容相对应,这些文档的相关性分数将会增加,因为它们被视为 star trek 中的额外匹配项!通过使术语等效,您不仅可以控制它们的匹配方式,还可以控制它们的排名和评分方式!

第一次尝试也只是冰山一角,控制代币发行方式的选项数量是无穷无尽的。您可以将整个过滤器库和其他步骤注入到流程中。您可以重新排序它们。做任何你需要解决你的问题。搜索并不难——它只是编程 :)。

例如,您可能决定通过更改同义词的应用方式来保留原始文本(此处 | 表示两个标记共享空间):

[星际迷航|皮卡德船长][正][路][酷][比][星战|韩独奏]

或过滤掉所有不匹配您的列表的术语(称为 keepwords):

[星际迷航|皮卡德船长] ... [星球大战|韩独奏]

选择是无穷无尽的!真正的收获在于分析器,您不必只为一种语言选择分析器。相反,您可以将不同的部分像乐高积木一样串在一起来处理文本。分析仪可以由各种不同的组件构成,包括

  1. 在将字符串转换为标记之前控制字符串处理的 字符过滤器
  2. 控制字符串如何转换为标记的单个 分词器
  3. 允许您操作每个标记的 标记过滤器 (同义词和小写是标记过滤器)。

关键是这里有一种简单的力量可以改善您的搜索结果。您可以操纵分析器并在更好、更相关的搜索中获得巨大收益。您可以直接了解匹配的工作原理,控制它,并根据您的需要精确地操纵它。此处的一个简单调整可以有效地解决搜索问题,让您拥有绝对的控制权。

更好的文字!不仅仅是文字!

如果您想更深入、更深入地了解这个分析器的内容,我强烈推荐 Relevant Search 的第 4 章。这可能是书中最好的章节之一。我什至没有亲自写过它,但我一直在向任何开始搜索和搜索相关性的人推荐它!剧透警报:我们展示的最酷的事情之一是你可以标记远不止文本。哎呀看 这里 ,我将图像标记为真正的 RGB 值的“标记”:) 搜索引擎太棒了!

快乐搜索,不要羞于与问题、问题、咨询需求等 联系 。还可以查看我们广泛使用的 Quepid 来尝试这些想法!