有效的中文搜索与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 '手机'
-
默认的
Chinese
分析器: 它只将所有汉字分成词元。因此,我们得到两个词元:手和机。Elasticsearch 的standard
分析器产生完全相同的输出。因此,Chinese
已弃用,很快将被standard
取代,应避免使用。 -
paoding
插件:paoding
几乎是行业标准,被认为是一种优雅的解决方案。不幸的是,Elasticsearch 的插件没有维护,我只能在经过一些修改后才能在 1.0.1 版本上运行它。(安装步骤略,原文已提供)安装后,我们得到了一个新的paoding
分词器和两个收集器:max_word_len
和most_word
。默认情况下没有公开分析器,因此我们必须声明一个新的分析器。(配置步骤略,原文已提供)两种配置都提供了良好的结果,具有清晰且唯一的词元。在处理更复杂的句子时,其行为也非常好。 -
cjk
分析器: 非常简单的分析器,它只将任何文本转换成二元组。“手机”只索引手机
,效果不错,但如果我们使用更长的词,例如“元宵节”(元宵节),则会生成两个词元:元宵和宵节,分别表示“元宵”和“宵节”。 -
smartcn
插件: 非常易于安装。(安装步骤略,原文已提供)它公开了一个新的smartcn
分析器,以及smartcn_tokenizer
分词器,使用 Lucene 的SmartChineseAnalyzer
。它使用概率套件来查找单词的最佳分割,使用隐马尔可夫模型和大量的训练文本。因此,已经嵌入了一个相当好的训练词典——我们的示例被正确地分词了。 -
ICU 插件: 另一个官方插件。(安装步骤略,原文已提供)如果您处理任何非英语语言,建议使用此插件。它公开了一个
icu_tokenizer
分词器,以及许多强大的分析工具,如icu_normalizer
、icu_folding
、icu_collation
等。它使用中文和日文字典,其中包含有关词频的信息,以推断汉字组。在“手机”上,一切正常,并且按预期工作,但在“元宵节”上,会产生两个词元:元宵和节——这是因为“元宵”和“节”比“元宵节”更常见。
结果比较 (表格略,原文已提供)
从我的角度来看,paoding
和 smartcn
获得了最佳结果。chinese
分词器非常糟糕,icu_tokenizer
在“元宵节”上有点令人失望,但在处理繁体中文方面表现非常好。
繁体中文支持
您可能需要处理来自文档或用户搜索请求的繁体中文。您需要一个规范化步骤将这些繁体输入转换为现代中文,因为像 smartcn
或 paoding
这样的插件无法正确处理它。
您可以通过您的应用程序进行处理,或者尝试使用 elasticsearch-analysis-stconvert
插件直接在 Elasticsearch 中进行处理。它可以双向转换繁体字和简体字。(安装步骤略,原文已提供)
最后一种解决方案是使用 cjk
:如果您无法正确分词输入,您仍然很有可能捕获所需的文档,然后使用 icu_tokenizer
(也相当好)来提高相关性。
进一步的改进
对于 Elasticsearch 的分析,没有完美的万能解决方案,中文也不例外。您必须根据获得的信息来组合和构建自己的分析器。例如,我在搜索字段上使用 cjk
和 smartcn
分词,使用多字段和多匹配查询。
(FAQ 部分略,原文已提供)
以上是有效的中文搜索与Elasticsearch的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

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

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

在PHP中,应使用password_hash和password_verify函数实现安全的密码哈希处理,不应使用MD5或SHA1。1)password_hash生成包含盐值的哈希,增强安全性。2)password_verify验证密码,通过比较哈希值确保安全。3)MD5和SHA1易受攻击且缺乏盐值,不适合现代密码安全。

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

PHP类型提示提升代码质量和可读性。1)标量类型提示:自PHP7.0起,允许在函数参数中指定基本数据类型,如int、float等。2)返回类型提示:确保函数返回值类型的一致性。3)联合类型提示:自PHP8.0起,允许在函数参数或返回值中指定多个类型。4)可空类型提示:允许包含null值,处理可能返回空值的函数。

PHP仍然具有活力,其在现代编程领域中依然占据重要地位。1)PHP的简单易学和强大社区支持使其在Web开发中广泛应用;2)其灵活性和稳定性使其在处理Web表单、数据库操作和文件处理等方面表现出色;3)PHP不断进化和优化,适用于初学者和经验丰富的开发者。

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

在PHP中使用预处理语句和PDO可以有效防范SQL注入攻击。1)使用PDO连接数据库并设置错误模式。2)通过prepare方法创建预处理语句,使用占位符和execute方法传递数据。3)处理查询结果并确保代码的安全性和性能。

PHP和Python各有优劣,选择取决于项目需求和个人偏好。1.PHP适合快速开发和维护大型Web应用。2.Python在数据科学和机器学习领域占据主导地位。
