首页 > 解决方案 > 如何在 Elasticsearch 中高效搜索动态定义的正则表达式?

问题描述

我在一个文件系统项目(如保管箱)中工作。对于文件系统,我在弹性搜索中有一个用于全文搜索的索引数据。我有很多大型文档,搜索效果非常好。但现在我的要求是使用这些数据来查询一些正则表达式。我们有一个客户管理面板,正则表达式将由客户在管理面板中动态定义。

我知道我可以在弹性搜索中进行正则表达式搜索,但这里的问题是分词器。例如,假设用户想要创建一个正则表达式模式并想要搜索 3 个字母、“-”和 2 个数字,例如“ABC-12”或“ASD-34”。这里的问题是我的标记器。定义的分词器省略了字符“-”,并分别索引“ABC”和“12”。您可能会说不是省略 '-' 字符。但是用户可能想要搜索一个包含 3 个字母、空格和 2 个数字的模式来检索数据“ABC 12”。这里的空白是问题所在。不知何故,我必须使用分词器并且不能涵盖所有动态正则表达式。所以在索引中搜索并不能解决我的问题。

实际上,对于这种类型的搜索,我还有另一种选择,即使用 match all 查询所有数据。使用 search scroll api,我可以部分查询所有原始文档。在滚动 api 的每个响应之后,我可以在单独的线程中运行我的正则表达式查找器。这样我就可以在滚动操作后准备所需的数据。你认为这个选项对大数据有好处吗?我想我需要良好的 CPU 功率和内存。我知道这不是一个特殊的解决方案,但我找不到任何有效的解决方案来满足我的要求。我愿意寻求更好的解决方案。谢谢。

标签: regexelasticsearchfull-text-searchfull-text-indexing

解决方案


我相信,ES 可以让你多次分析同一个字段。文档指出,以后可以将新的分析器添加到现有字段:

可以使用PUT 映射 API将新的多字段添加到现有字段。

当您找到用户所追求的正则表达式时,这为动态添加新的分析器(和标记器)提供了可能性。我不确定它对于您的特定用例有多微不足道,但这似乎是一种探索的途径


推荐阅读