【发布时间】:2023-04-06 09:47:01
【问题描述】:
我们目前在弹性搜索索引中有大量文档并进行全文搜索。我在项目中的下一个要求是查找文档中的所有信用卡数据。用户将来也可以动态定义一些正则表达式搜索规则。但使用标准分析器无法搜索信用卡信息或任何用户定义的规则。 例如,假设一个文档包含信用卡信息,例如 4321-4321-4321-4321 或 4321 4321 4321 4321。弹性搜索将此数据索引为 4 个部分,如下所示:
"tokens" : [
{
"token" : "4321",
"start_offset" : 0,
"end_offset" : 4,
"type" : "<NUM>",
"position" : 0
},
{
"token" : "4321",
"start_offset" : 5,
"end_offset" : 9,
"type" : "<NUM>",
"position" : 1
},
{
"token" : "4321",
"start_offset" : 10,
"end_offset" : 14,
"type" : "<NUM>",
"position" : 2
},
{
"token" : "4321",
"start_offset" : 15,
"end_offset" : 19,
"type" : "<NUM>",
"position" : 3
}
]
我现在只是不考虑 Luhm 算法。如果我使用 reg exp "([0-9]{4}[- ]){3}[0-9]{4}" 进行基本正则表达式搜索以查找信用卡,则它不会返回任何内容,因为未分析数据并为此编制索引。我想为此目的,我需要为正则表达式搜索定义一个自定义分析器,并将另一个版本的数据存储在另一个字段或索引中。但正如我之前所说,将来用户将定义他/她自己的自定义规则模式进行搜索。我应该如何定义自定义分析器?我应该为此定义 ngram tokenizer(min:2, max:20) 吗?使用 ngram 标记器,我想我可以搜索所有已定义的正则表达式规则。但这合理吗?项目必须处理大量数据而没有任何性能问题。 (将索引一个公司的整个文件系统)。对于此类数据发现问题,您还有其他建议吗?我目前的主要目的是寻找信用卡。感谢您的帮助。
【问题讨论】:
-
除了在 ES 中存储信用卡号并不是一个好主意(但这不是这里的重点),用户是否能够在 ES 中搜索任何前缀/中缀/后缀子字符串?信用卡号还是只有完整的信用卡号?
-
我的目标是检测包含敏感数据的文档,以便我可以对这些类型的文档采取措施。我对信用卡中的任何子字符串都不感兴趣。
-
所以你确认你只会搜索 16 位数字(加上一些最终的分隔符号)?
-
信用卡是的。但是将来还会有一些其他规则,例如查找包含社会安全号码的文件。更多的模式将被添加到系统中。这就是为什么我想用 ngram 进行分析。
-
好的,但这将在不同的领域,对吧?还是这些数字在大量文本中?
标签: elasticsearch full-text-search inverted-index elasticsearch-analyzers