我有一个用例,需要对大约 510 万条记录进行复杂的字符串匹配。当我说复杂的字符串匹配时,我的意思是使用库来进行模糊字符串匹配。 (http://blog.bripkens.de/fuzzy.js/demo/)
我们在工作中使用的数据库是 SAP Hana,它非常适合检索和查询,因为它位于内存中,因此我希望避免从那里提取数据并将其重新填充到应用程序层的内存中,但同时我无法利用这些库(数据库中有一个用于模糊匹配的 API,但它对我们来说不够全面)。
这里的中间立场是什么?如果我进行预处理并将数据库中的单词与用户可能搜索的某些关键字相关联,我可以减少开销,但是在这方面是否有任何最佳实践?
如果有关系的话。该列表是账单描述符列表(显示在 CC 报表上),因此,用户将搜索这些描述符以找出该描述符也属于哪些公司。
最佳答案
假设您的“账单描述符”是一个单列,可能是 (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。
在一个项目中,我们对多个地址列(姓名、公司名称、邮政编码、街道)进行了自由式搜索,并且在不使用任何特殊索引的情况下,我们在 ca 6 Mio 记录上获得了 100-200 毫秒的响应时间。
关于javascript - 对 5M 记录进行复杂字符串搜索的最佳方法是什么?应用层还是数据库层?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41305881/