品牌网站建设可信大蝌蚪,江门网站程序开发制作,WordPress来必力,电子商务网站建设与管理 学习感想本文所使用的ES集群环境可在历史文章中获取#xff0c;采用docker部署的方式。 Elasticsearch 是一个功能强大的搜索引擎#xff0c;广泛用于构建复杂的全文搜索应用程序。在许多情况下#xff0c;为了提高搜索引擎的性能和精度#xff0c;我们可以使用外部词库来定制和扩展… 本文所使用的ES集群环境可在历史文章中获取采用docker部署的方式。 Elasticsearch 是一个功能强大的搜索引擎广泛用于构建复杂的全文搜索应用程序。在许多情况下为了提高搜索引擎的性能和精度我们可以使用外部词库来定制和扩展 Elasticsearch 的文本处理和搜索功能。本文将介绍外部词库的用途、优势以及如何在 Elasticsearch 中使用它们。
为什么需要外部词库
Elasticsearch 默认提供了一套强大的文本处理工具包括分词、标记过滤、同义词处理等。然而在某些情况下我们需要更多的控制权来适应特定的用例和需求。外部词库允许我们 自定义分词器通过使用外部词库您可以创建自定义分词器以根据特定需求定义文本分割规则。这对于处理不同语言或行业的文本非常有用。 扩展停用词列表停用词如and、the等通常被排除在搜索索引之外。外部词库允许您将领域特定的停用词添加到索引中以便更好地适应我们行业内的数据。 同义词处理创建同义词词库可确保相关词汇在搜索时被正确映射提高搜索结果的准确性。 专业术语对于特定领域或行业我们可以通过创建外部词库以包含特定领域的专业术语确保搜索引擎能够理解和处理这些术语。
使用外部词库的优势
使用外部词库有以下优势 提高搜索质量通过自定义分词和停用词可以确保搜索引擎更好地理解和处理文本提高搜索质量。 适应特定需求外部词库允许根据特定用例和领域需求对搜索引擎进行定制以满足工作要求。 更好的用户体验通过包含专业术语和扩展的同义词映射用户能够更轻松地找到他们需要的内容。
如何在 Elasticsearch 中使用外部词库
在 Elasticsearch 中使用外部词库通常涉及以下步骤 创建外部词库文件首先我们需要准备一个外部词库文件其中包含自定义的词汇、同义词或停用词列表。 将词库上传到 Elasticsearch上传词库文件到 Elasticsearch 配置索引将外部词库与索引相关联以确保 Elasticsearch 在索引文档时使用这些词汇。 搜索优化根据需要在搜索查询中应用外部词库以扩展或定制搜索行为。
示例使用自定义词库分词
本文在 IK 分词器的基础上增加自定义分词并配置本地词库文件远程热更新词库文件。
本地词库 首先在启动的ES中对醉鱼两个字进行分词IK 默认分为两个汉字 GET _analyze
{analyzer: ik_max_word,text: [醉鱼]
}结果如下 {tokens : [{token : 醉,start_offset : 0,end_offset : 1,type : CN_CHAR,position : 0},{token : 鱼,start_offset : 1,end_offset : 2,type : CN_CHAR,position : 1}]
} 而我们的需求是让其能分为一次词语而不是两个汉字那么下面引入我们的自定义分词文件 在 ES 的 plugins/ik/config 目录下创建自定义词库文件 zuiyu.dic文件内容如下格式为一个词语为一行。 醉鱼修改 IK 的配置支持自定义分词文件 修改plugins/ik/config 目录下的IKAnalyzer.cfg.xml修改其中entry keyext_dict/entry的值为本地文件路径配置为相对路径直接填写上一步创建的zuiyu.dic结果如下 entry keyext_dictzuiyu.dic/entry ?xml version1.0 encodingUTF-8?
!DOCTYPE properties SYSTEM http://java.sun.com/dtd/properties.dtd
propertiescommentIK Analyzer 扩展配置/comment!--用户可以在这里配置自己的扩展字典 --entry keyext_dictzuiyu.dic/entry!--用户可以在这里配置自己的扩展停止词字典--entry keyext_stopwords/entry!--用户可以在这里配置远程扩展字典 --!--entry keyremote_ext_dict/entry--!--用户可以在这里配置远程扩展停止词字典--!-- entry keyremote_ext_stopwordswords_location/entry --
/properties 如果是启动的ES集群需要复制当前两个文件到所有的集群中 1、当前集群有三个节点其中都配置本地词库文件但是node1node2中都没有增加醉鱼这词语只有node3有此时使用分词是无法达到预期效果的。 2、node1中配置正常的entry keyext_dictzuiyu.dic/entryzuiyu.dic中也包含醉鱼这个词语。node2node3都不配置ext_dict此时当前这个环境是可以进行正确分词达到预期的结果的。 重启 ES 测试分词效果使用同样的分词语句 GET _analyze
{analyzer: ik_max_word,text: [醉鱼]
}结果如下 {tokens : [{token : 醉鱼,start_offset : 0,end_offset : 2,type : CN_WORD,position : 0}]
}一般来说词语肯定不是固定的随着工作的长期积累不断地发现新的专业术语那么热更新动态更新词库不在每次更新词库之后重启ES就是非常有必要的了下面来看一下热更新词库。
远程词库热更新
热更新词库的区别就是IKAnalyzer.cfg.xml文件中的一个配置的问题。不过核心还是需要一个词库文件刚才是通过路径访问的但是无法热更新所以现在需要改为URL访问也就是 HTTP 请求可以读取到的形式。一个词语一行返回即可。
此处使用 Nginx 来做演示。Nginx 中的配置如下 nginx.conf location /dic/zuiyu.dic {alias html/dic/zuiyu.dic; }zuiyu.dic 文件内容如下 醉鱼IKAnalyzer.cfg.xml配置修改如下,IP为部署的 Nginx 的 IP 端口也是根据自己 Nginx 监听的端口修改 entry keyremote_ext_dicthttp://192.168.30.240:8088/dic/zuiyu.dic/entry完整的配置如下 ?xml version1.0 encodingUTF-8?
!DOCTYPE properties SYSTEM http://java.sun.com/dtd/properties.dtd
propertiescommentIK Analyzer 扩展配置/comment!--用户可以在这里配置自己的扩展字典 --entry keyext_dictzuiyu.dic/entry!--用户可以在这里配置自己的扩展停止词字典--entry keyext_stopwords/entry!--用户可以在这里配置远程扩展字典 --entry keyremote_ext_dicthttp://192.168.30.240:8088/dic/zuiyu.dic/entry!--用户可以在这里配置远程扩展停止词字典--!-- entry keyremote_ext_stopwordswords_location/entry --
/properties 验证URL访问结果使用浏览器或者postman等工具访问 http://192.168.30.240:8088/dic/zuiyu.dic 可以返回我们的文件内容即可也是一个词语一行的形式。 复制IKAnalyzer.cfg.xml 到集群的每个节点中 重启ES 测试对 醉鱼 分词可以看到与上面本地词库时是同样的效果 {tokens : [{token : 醉鱼,start_offset : 0,end_offset : 2,type : CN_WORD,position : 0}]
}测试对我爱你醉鱼进行分词 GET _analyze
{analyzer: ik_max_word,text: [我爱你醉鱼]
}结果如下 {tokens : [{token : 我爱你,start_offset : 0,end_offset : 3,type : CN_WORD,position : 0},{token : 爱你,start_offset : 1,end_offset : 3,type : CN_WORD,position : 1},{token : 醉鱼,start_offset : 3,end_offset : 5,type : CN_WORD,position : 2}]
}在zuiyu.dic中增加我爱你醉鱼最终的文件内容如下 醉鱼
我爱你醉鱼增加完成之后这5个字已经成为一个词语分词结果如下 {tokens : [{token : 我爱你醉鱼,start_offset : 0,end_offset : 5,type : CN_WORD,position : 0},{token : 我爱你,start_offset : 0,end_offset : 3,type : CN_WORD,position : 1},{token : 爱你,start_offset : 1,end_offset : 3,type : CN_WORD,position : 2},{token : 醉鱼,start_offset : 3,end_offset : 5,type : CN_WORD,position : 3}]
}仅在一个节点 node1 中配置了远程词库node2 与 node3 都没有配置任何的词库此时当前环境无法达到我们的预期分词效果
总结
通过上面我们的试验可以发现结合 IK分词器使用自定义词库可以满足我们专业内的词语分词实现更好的分词效果再加上动态词库的更新对我们的工作还是很有必要的配置过程是不是很简单下面就赶紧用起来吧。