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

Will using a database improve performance when sorting entries by string similarity?

我有一个 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 个城市。为此使用数据库有什么好处吗?我已经得到了相当满意的结果,但我不知道我是否可以稍微加快速度以获得新功能的更多开销。

用途是:用户将进入一个城市,他们将获得一条他们需要的有关该城市的信息。由于这么多城市共享相同的名称,我按字符串相似度排序,然后按人口排序,这可能会得到最相关的结果,但无论如何我 return 5 可以肯定。

已经相当快了。我不知道有多快但是不到一秒,包括启动将文档加载到内存并解析它。一旦开始,它也非常快。这不是瞬间的。我用 https://www.npmjs.com/package/string-similarity

我不知道你的 stringSimilarity 是做什么的,但是,即使它做了像 BM25 这样的事情,通常 DB 会这样做,使用 DB 会更慢。如果是其他情况,则必须在允许的情况下自定义数据库(或搜索引擎)。它会更慢。如果不允许,您将对数据库条目执行您所做的操作,计算相似度和排序。会更慢。

数据库使用二进制文件,它们严重依赖缓存(例如 B 树索引),因为文件 IO 比内存慢得多。当您不能将所有内容都放在内存中或不想浪费内存时,请使用 DB。

此外,用于排序的 compareFunction 不需要减去 population,因为它用于相对比较。

cityList.sort((city1,city2) => 
  stringSimilarity(city1.name, query) -
  stringSimilarity(city2.name, query)
)