如何解决按字符串相似度对条目进行排序时,使用数据库会提高性能吗?
[{
"name": "Guayabal de Síquima","country": "Colombia","population": 1051,"timezone": "America/Bogota"
},{
"name": "Maracaibo","country": "Venezuela","population": 19637,"timezone": "America/Caracas"
}]
cityList.sort((city1,city2) =>
(stringSimilarity(city1.name,query) - population) -
(stringSimilarity(city2.name,query) - population))
我还创建了一个数组,每个时区只包含国家和城市,这样我就可以做同样的事情,但使用国家。这是一个相当大的名单,有 137,530 个城市。为此使用数据库有什么好处吗?我已经得到了相当满意的结果,但我不知道我是否可以稍微加快速度以获得更多的新功能开销。
用途是:用户进入一个城市,他们会得到一条他们需要的关于它的信息。由于这么多城市具有相同的名称,我先按字符串相似度对它们进行排序,然后按人口排序,这可能会得到最相关的结果,但我还是返回 5 以确保。
已经相当快了。我不知道有多快,但它不到一秒钟,包括启动将文档加载到内存并解析它。一旦开始,它也非常快。这不是瞬间的。我使用https://www.npmjs.com/package/string-similarity
解决方法
我不知道你的 stringSimilarity
是做什么的,但是,即使它做了像 BM25
这样通常 DB 做的事情,使用 DB 会更慢。如果是别的东西,如果允许,您必须自定义数据库(或搜索引擎)。它会更慢。如果不允许,你就做你所做的,计算相似性和排序,对数据库条目。会更慢。
DB 使用二进制文件并且它们严重依赖缓存(例如 B 树索引),因为文件 IO 比内存慢得多。当您无法将所有内容都放在内存中或不想浪费内存时,请使用 DB。
此外,用于排序的 compareFunction 不需要减去 population
,因为它是用于相对比较。
cityList.sort((city1,city2) =>
stringSimilarity(city1.name,query) -
stringSimilarity(city2.name,query)
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。