关键字通配符查询 vs. Ngram + 多重匹配

问题描述 投票:0回答:1

所以我有一些如下所示的字段:

订单ID:ABC-DEF-1234

日期:2024-02-24

最后更新时间:2024-02-24T12:09:48.763-05:00

我的用户希望拥有这样的功能:无论他们在搜索栏中输入什么(例如X),只要文档中的任何字段完全包含输入X,即可找到所有文档。因此,像

DE
02-24
09:48
这样的输入都会在上面找到我的示例。

为了想出最好的解决方案,我基本上考虑两件事:

  1. 如何/做什么索引这些字段
  2. 如何/什么在这些字段上构建我的查询

请记住,我的数据在生产中可能会受到这些限制

  1. 记录数 - 我预计是100,000 ~ 500,000
  2. 需要上述支持的字段数量 - 大约 10

经过一番研究,我基本上有两个选择:

1。将字段索引为关键字并使用通配符查询(不作为通配符索引,因为不满足建议使用通配符的条件(值> 32KB或> 100万条记录)

索引时间:

  • 只需将这些术语索引为关键字

搜索时间:

  • 对每个字段使用通配符查询
    *X*

问:我了解到应避免从

*
开始,否则性能会受到影响。考虑到我的记录数量(50 万)和大约 10 列,我们谈论的性能有多糟糕,因为我现在没有一种简单的方法来模拟我将在生产中拥有的记录数量?

2。使用 N-gram 分析器 将字段索引为文本并使用多重匹配查询

索引时间:

  • 使用 N-gram 分析器对所有字段建立索引。
  • 如果我理解正确,N-gram 分析器会将
    ABC-DEF-1234
    标记为
    A
    AB
    ABC
    DEF-1
    ABC-DEF-1234
    ...(参数最小长度为 1 时的所有相邻子字符串和最大长度)

搜索时间:

  • 直接对所有这些字段上的用户输入进行多重匹配查询

问:这似乎显着增加了索引时间以及所有这些标记化术语的存储成本。但是,如果这在查询性能方面大大优于选项 1,我可能会接受它。

所以如果我的分析是正确的,我目前倾向于选项2。但只是想分享一下是否有更好的方法或更好地权衡性能和成本的方法。如果我的任何假设不正确,请告诉我。干杯!

elasticsearch elastic-stack opensearch
1个回答
0
投票

您的分析非常正确,并且您正确地概述了两个选项之间的权衡。选择可能取决于您的具体用例。我知道没有简单的方法可以使用真实的数据和查询进行彻底的测试,但它将帮助您做出决定。

通配符字段类型可以帮助您优化通配符查询。

如果您打算定期使用通配符类型搜索字段 通配符或正则表达式查询并满足以下条件之一:

该字段包含超过一百万个唯一值。并且您计划 定期使用带有前导通配符的模式搜索字段, 例如 *foo 或 *baz。该字段包含大于 32KB 的值。和 您计划使用任何通配符模式定期搜索该字段。

https://www.elastic.co/blog/find-strings-within-strings-faster-with-the-new-elasticsearch-wildcard-field

© www.soinside.com 2019 - 2024. All rights reserved.