我对数据结构还很陌生,但是我试图在我的应用程序后端(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数据库中会更好吗?有没有一种方法可以有效地配置数据库表,以允许基于后缀的快速查找?
谢谢!
答案 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/