所以我有一些如下所示的字段:
订单ID:ABC-DEF-1234
日期:2024-02-24
最后更新时间:2024-02-24T12:09:48.763-05:00
我的用户希望拥有这样的功能:无论他们在搜索栏中输入什么(例如X),只要文档中的任何字段完全包含输入X,即可找到所有文档。因此,像
DE
、02-24
、09:48
这样的输入都会在上面找到我的示例。
为了想出最好的解决方案,我基本上考虑两件事:
请记住,我的数据在生产中可能会受到这些限制
经过一番研究,我基本上有两个选择:
1。将字段索引为关键字并使用通配符查询(不作为通配符索引,因为不满足建议使用通配符的条件(值> 32KB或> 100万条记录)
索引时间:
搜索时间:
*X*
问:我了解到应避免从
*
开始,否则性能会受到影响。考虑到我的记录数量(50 万)和大约 10 列,我们谈论的性能有多糟糕,因为我现在没有一种简单的方法来模拟我将在生产中拥有的记录数量?
2。使用 N-gram 分析器 将字段索引为文本并使用多重匹配查询
索引时间:
ABC-DEF-1234
标记为 A
、AB
、ABC
、DEF-1
、ABC-DEF-1234
...(参数最小长度为 1 时的所有相邻子字符串和最大长度)搜索时间:
问:这似乎显着增加了索引时间以及所有这些标记化术语的存储成本。但是,如果这在查询性能方面大大优于选项 1,我可能会接受它。
所以如果我的分析是正确的,我目前倾向于选项2。但只是想分享一下是否有更好的方法或更好地权衡性能和成本的方法。如果我的任何假设不正确,请告诉我。干杯!
您的分析非常正确,并且您正确地概述了两个选项之间的权衡。选择可能取决于您的具体用例。我知道没有简单的方法可以使用真实的数据和查询进行彻底的测试,但它将帮助您做出决定。
通配符字段类型可以帮助您优化通配符查询。
如果您打算定期使用通配符类型搜索字段 通配符或正则表达式查询并满足以下条件之一:
该字段包含超过一百万个唯一值。并且您计划 定期使用带有前导通配符的模式搜索字段, 例如 *foo 或 *baz。该字段包含大于 32KB 的值。和 您计划使用任何通配符模式定期搜索该字段。