微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

按字符串相似度对条目进行排序时,使用数据库会提高性能吗?

如何解决按字符串相似度对条目进行排序时,使用数据库会提高性能吗?

我有一个 11 MB 的 JSON 文件,如下所示:

[{
  "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 举报,一经查实,本站将立刻删除。