搜索
首页后端开发php教程有效的中文搜索与Elasticsearch

Elasticsearch 中文搜索:分析器与最佳实践

Elasticsearch 的内容索引中,分析和词元化至关重要,尤其处理非英语语言时。对于中文,由于汉字的特性以及词句之间缺乏空格,这一过程更为复杂。

本文探讨 Elasticsearch 中分析中文内容的几种方案,包括默认的中文分析器、paoding 插件、cjk 分析器、smartcn 分析器和 ICU 插件,并分析其优缺点及适用场景。

中文搜索的挑战

汉字是表意文字,代表一个词或语素(语言中最小的有意义单位)。组合在一起,其含义会发生变化,代表一个全新的词。另一个难点是词句之间没有空格,这使得计算机很难知道一个词从哪里开始,到哪里结束。

即使只考虑普通话(中国官方语言,也是世界上使用最广泛的汉语),也有数万个汉字,即使实际书面汉语只需要认识三千到四千个汉字。例如,“火山”(火山)实际上是以下两个汉字的组合:

  • 火:火
  • 山:山

我们的分词器必须足够聪明,避免将这两个汉字分开,因为它们组合在一起的意义与分开时不同。

另一个难点是使用的拼写变体:

  • 简体中文:书法
  • 繁体中文,更复杂、更丰富:書法
  • 拼音,普通话的罗马化形式:shū fǎ

Elasticsearch 中的中文分析器

目前,Elasticsearch 提供以下几种中文分析器:

  • 默认的 Chinese 分析器,基于 Lucene 4 中已弃用的类;
  • paoding 插件,虽然不再维护,但基于非常好的词典;
  • cjk 分析器,它对内容进行二元组化;
  • smartcn 分析器,一个官方支持的插件;
  • ICU 插件及其分词器。

这些分析器的差异很大,我们将通过一个简单的测试词“手机”来比较它们的性能。“手机”的意思是“手机”,它由两个汉字组成,分别表示“手”和“机”。“机”字还构成许多其他词:

  • 机票:机票
  • 机器人:机器人
  • 机枪:机枪
  • 机遇:机遇

我们的分词不能拆分这些汉字,因为如果我搜索“手机”,我不希望出现关于 Rambo 拥有机枪的任何文档。

我们将使用强大的 _analyze API 测试这些方案:

curl -XGET 'http://localhost:9200/chinese_test/_analyze?analyzer=paoding_analyzer1' -d '手机'

Efficient Chinese Search with Elasticsearch

  • 默认的 Chinese 分析器: 它只将所有汉字分成词元。因此,我们得到两个词元:手和机。Elasticsearch 的 standard 分析器产生完全相同的输出。因此,Chinese 已弃用,很快将被 standard 取代,应避免使用。

  • paoding 插件: paoding 几乎是行业标准,被认为是一种优雅的解决方案。不幸的是,Elasticsearch 的插件没有维护,我只能在经过一些修改后才能在 1.0.1 版本上运行它。(安装步骤略,原文已提供)安装后,我们得到了一个新的 paoding 分词器和两个收集器:max_word_lenmost_word。默认情况下没有公开分析器,因此我们必须声明一个新的分析器。(配置步骤略,原文已提供)两种配置都提供了良好的结果,具有清晰且唯一的词元。在处理更复杂的句子时,其行为也非常好。

  • cjk 分析器: 非常简单的分析器,它只将任何文本转换成二元组。“手机”只索引 手机,效果不错,但如果我们使用更长的词,例如“元宵节”(元宵节),则会生成两个词元:元宵和宵节,分别表示“元宵”和“宵节”。

  • smartcn 插件: 非常易于安装。(安装步骤略,原文已提供)它公开了一个新的 smartcn 分析器,以及 smartcn_tokenizer 分词器,使用 Lucene 的 SmartChineseAnalyzer。它使用概率套件来查找单词的最佳分割,使用隐马尔可夫模型和大量的训练文本。因此,已经嵌入了一个相当好的训练词典——我们的示例被正确地分词了。

  • ICU 插件: 另一个官方插件。(安装步骤略,原文已提供)如果您处理任何非英语语言,建议使用此插件。它公开了一个 icu_tokenizer 分词器,以及许多强大的分析工具,如 icu_normalizericu_foldingicu_collation 等。它使用中文和日文字典,其中包含有关词频的信息,以推断汉字组。在“手机”上,一切正常,并且按预期工作,但在“元宵节”上,会产生两个词元:元宵和节——这是因为“元宵”和“节”比“元宵节”更常见。

结果比较 (表格略,原文已提供)

从我的角度来看,paodingsmartcn 获得了最佳结果。chinese 分词器非常糟糕,icu_tokenizer 在“元宵节”上有点令人失望,但在处理繁体中文方面表现非常好。

繁体中文支持

您可能需要处理来自文档或用户搜索请求的繁体中文。您需要一个规范化步骤将这些繁体输入转换为现代中文,因为像 smartcnpaoding 这样的插件无法正确处理它。

您可以通过您的应用程序进行处理,或者尝试使用 elasticsearch-analysis-stconvert 插件直接在 Elasticsearch 中进行处理。它可以双向转换繁体字和简体字。(安装步骤略,原文已提供)

最后一种解决方案是使用 cjk:如果您无法正确分词输入,您仍然很有可能捕获所需的文档,然后使用 icu_tokenizer(也相当好)来提高相关性。

进一步的改进

对于 Elasticsearch 的分析,没有完美的万能解决方案,中文也不例外。您必须根据获得的信息来组合和构建自己的分析器。例如,我在搜索字段上使用 cjksmartcn 分词,使用多字段和多匹配查询。

(FAQ 部分略,原文已提供)

以上是有效的中文搜索与Elasticsearch的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
unset()和session_destroy()有什么区别?unset()和session_destroy()有什么区别?May 04, 2025 am 12:19 AM

Thedifferencebetweenunset()andsession_destroy()isthatunset()clearsspecificsessionvariableswhilekeepingthesessionactive,whereassession_destroy()terminatestheentiresession.1)Useunset()toremovespecificsessionvariableswithoutaffectingthesession'soveralls

在负载平衡的情况下,什么是粘性会话(会话亲和力)?在负载平衡的情况下,什么是粘性会话(会话亲和力)?May 04, 2025 am 12:16 AM

stickysessensureuserRequestSarerOutedTothesMeServerForsessionDataConsisterency.1)sessionIdentificeAssificationAssigeaSsignAssignSignSuserServerServerSustersusiseCookiesorUrlModifications.2)一致的ententRoutingDirectSsssssubsequeSssubsequeSubsequestrequestSameSameserver.3)loadBellankingDisteributesNebutesneNewuserEreNevuseRe.3)

PHP中有哪些不同的会话保存处理程序?PHP中有哪些不同的会话保存处理程序?May 04, 2025 am 12:14 AM

phpoffersvarioussessionsionsavehandlers:1)文件:默认,简单的ButMayBottLeneckonHigh-trafficsites.2)Memcached:高性能,Idealforsforspeed-Criticalapplications.3)REDIS:redis:similartomemememememcached,withddeddeddedpassistence.4)withddeddedpassistence.4)databases:gelifforcontrati forforcontrati,有用

PHP中的会话是什么?为什么使用它们?PHP中的会话是什么?为什么使用它们?May 04, 2025 am 12:12 AM

PHP中的session是用于在服务器端保存用户数据以在多个请求之间保持状态的机制。具体来说,1)session通过session_start()函数启动,并通过$_SESSION超级全局数组存储和读取数据;2)session数据默认存储在服务器的临时文件中,但可通过数据库或内存存储优化;3)使用session可以实现用户登录状态跟踪和购物车管理等功能;4)需要注意session的安全传输和性能优化,以确保应用的安全性和效率。

说明PHP会话的生命周期。说明PHP会话的生命周期。May 04, 2025 am 12:04 AM

PHPsessionsstartwithsession_start(),whichgeneratesauniqueIDandcreatesaserverfile;theypersistacrossrequestsandcanbemanuallyendedwithsession_destroy().1)Sessionsbeginwhensession_start()iscalled,creatingauniqueIDandserverfile.2)Theycontinueasdataisloade

绝对会话超时有什么区别?绝对会话超时有什么区别?May 03, 2025 am 12:21 AM

绝对会话超时从会话创建时开始计时,闲置会话超时则从用户无操作时开始计时。绝对会话超时适用于需要严格控制会话生命周期的场景,如金融应用;闲置会话超时适合希望用户长时间保持会话活跃的应用,如社交媒体。

如果会话在服务器上不起作用,您将采取什么步骤?如果会话在服务器上不起作用,您将采取什么步骤?May 03, 2025 am 12:19 AM

服务器会话失效可以通过以下步骤解决:1.检查服务器配置,确保会话设置正确。2.验证客户端cookies,确认浏览器支持并正确发送。3.检查会话存储服务,如Redis,确保其正常运行。4.审查应用代码,确保会话逻辑正确。通过这些步骤,可以有效诊断和修复会话问题,提升用户体验。

session_start()函数的意义是什么?session_start()函数的意义是什么?May 03, 2025 am 12:18 AM

session_start()iscucialinphpformanagingusersessions.1)ItInitiateSanewsessionifnoneexists,2)resumesanexistingsessions,and3)setsasesessionCookieforContinuityActinuityAccontinuityAcconActInityAcconActInityAcconAccRequests,EnablingApplicationsApplicationsLikeUseAppericationLikeUseAthenticationalticationaltication and PersersonalizedContentent。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),