对 5M 记录进行复杂字符串搜索的最佳方法是什么?应用层还是数据库层?

What is the best way to do complicated string search on 5M records ? Application layer or DB layer?

我有一个用例,我需要对大约 510 万条记录进行复杂的字符串匹配。当我说复杂的字符串匹配时,我的意思是使用库来进行模糊字符串匹配。 (http://blog.bripkens.de/fuzzy.js/demo/)

我们在工作中使用的数据库是 SAP Hana,它非常适合检索和查询,因为它在内存中,所以我想避免从那里提取数据并在应用程序层将其重新填充到内存中,但在同时我无法利用这些库(数据库中有一个 API 用于模糊匹配,但它对我们来说不够全面)。

这里的中间立场是什么?如果我进行预处理并将数据库中的单词与用户可能搜索的某些关键字相关联,我可以减少开销,但是在这方面是否有任何最佳实践?

如果重要的话。该列表是账单描述符列表(显示在 CC 报表上)因此,用户将搜索这些描述符以找出描述符也属于哪些公司。

假设您的 "billing descriptor" 是单列,可能是 (N)VARCHAR 类型,我将从一个非常简单的 SAP HANA 模糊搜索开始,例如:

SELECT top 100 SCORE() AS score, <more fields>
FROM <billing_documents>
WHERE CONTAINS(<bill_descr_col>, <user_input>, FUZZY(0.7))
ORDER BY score DESC;

当您想在结果集上应用您的 js 库时,也许这已经足够好了。如果没有,我将开始尝试使用 similarCalculationMode 选项,例如 'similarcalculationmode=substringsearch' 等。而且我总是会查看响应时间,使用某些选项时响应时间可能会更长。 只有当响应时间太长,或者许多活跃的并发用户正在使用您的查询时,我才会尝试在您的搜索栏上创建一个模糊搜索索引。如果您需要更多搜索选项,您还可以创建全文索引。

但这完全取决于您的用例、您想要比较的值等。 针对不同的用例,有一套非常全面的功能和选项,请查看 help.sap.com/hana/SAP_HANA_Search_Developer_Guide_en.pdf.

在一个项目中,我们对多个地址列(姓名、姓氏、公司名称、post 代码、街道)进行了自由式搜索,我们在大约 6 条 Mio 记录上获得了 100-200 毫秒的响应时间使用任何特殊索引。