如何在后端创建快速自动完成功能

时间:2019-03-03 10:55:26

标签: javascript node.js database express data-structures

我对数据结构还很陌生,但是我试图在我的应用程序后端(nodeJS Express服务器)上实现高效的城市查找/城市自动完成功能。

最初,我只在内存中加载一系列城市(大约20.000个城市);我让我的客户端应用通过端点/search搜索城市,并向他们返回与用户搜索的城市匹配的城市列表:

import cities from './cities.json';

// Search endpoint
app.get('/search', (req, res) => {
  const results = [];
  const searchKey = req.body.key.toLowerCase();

  for (let city of cities) {
    if (city.toLowerCase().contains(searchKey)) {
      results.push(city);

      // Max 10 cities
      if (results.length > 10) {
        break;
      }
    }
  }

  res.json(cities);
});

尽管由于我只有20.000个城市,所以这种方法运行速度很快,但我认为就时间复杂度而言,这是非常糟糕的,因为最坏的情况是O(n)

因此,我正在考虑实现基于后缀树的字典,因此查找键的复杂度为O(m)m是键的长度(如果我错误),但需要付出更高的空间复杂度。

但是正如我所说的,我对所有这些都有些陌生,所以我的问题是:

1)通常要实现快速自动完成功能?

2)如果将城市存储在SQL数据库中会更好吗?有没有一种方法可以有效地配置数据库表,以允许基于后缀的快速查找?

谢谢!

2 个答案:

答案 0 :(得分:1)

根据我的经验,ElasticSearch可以作为自动完成的解决方案。它具有可扩展性和强大功能。推荐阅读一些推荐的教程:

您还可以在其官方文档中找到一些自动完成文档:

https://www.elastic.co/guide/en/elasticsearch/guide/master/_index_time_search_as_you_type.html -https://www.elastic.co/guide/en/elasticsearch/reference/6.6/search-suggesters-completion.html

答案 1 :(得分:-1)

考虑使用自动完成功能(jquery UI) https://jqueryui.com/autocomplete/