0

我正在开发我的第一个 Flask 应用程序(使用 sqlite 作为数据库)。它将用户的单个名称作为查询,并显示有关此名称的信息作为响应。

一切正常,但我想实现 typeahead.js 以提供更好的用户体验。Typeahead.js 将请求作为用户类型发送到服务器,并在下拉列表中建议可能的名称。现在我正在搜索数据库select * from table_name where name like 'QUERY%'。但这当然没有我希望的那么快——它可以工作,但有明显的输入延迟(我想更少或大约一秒)。

为了加快速度,我查看了一些内存缓存选项(如 Redis 或 memcached),但它们是键值存储,因此我认为不符合我的需求。我认为可能的选择是列出名称([“Jane”,“John”,“Jack”],总共大约 200k 个名称),将其加载到 ram 中并在那里进行搜索。但是如何在 Flask 中加载内存中的内容呢?

无论如何,我的问题是:使这种搜索(通过前几个字母)更快(在 Python/Flask 中)的最佳方法是什么?

4

2 回答 2

0

您正在寻找“部分匹配”。我会将所有可能的名称加载到一个数组中,并对它们进行排序。然后我将单独创建一个 (26x26) 查找数组,该数组显示名称列表中第一个元素的索引,该索引对应于前两个字母的组合;您可能还拥有所有可能的三个字母组合的字典(而不是详尽的列表),这将加快您的搜索速度(因为它将它限制在数组的一个小得多的部分)。

换句话说-您根本不会真正搜索(对于两个和三个字母的组合);您将返回数组的一部分。一旦匹配超过三个,您可能可以搜索切片(不值得创建超过三个字符的表)。

于 2013-08-30T20:33:56.783 回答
0

我的回答没有告诉你如何在内存中搜索,因为我认为你可以做一些事情来改进你的数据库搜索,如果实施得当,它们会非常有效。

我假设你索引了name你的 sqlite 数据库中的字段,对吗?如果您的name字段没有被索引,那么任何搜索都将非常低效。

如果即使使用索引,您的搜索速度也很慢,您可以尝试不使用LIKE关键字,而是搜索范围。

例如,如果用户键入“Jo”,您可以发出以下查询:

select * from table_name where name between 'Jo' and 'Joz'

所以基本上你只是告诉数据库按字母顺序查找查询文本和附加最后一个有效字符的查询文本之间的所有可能名称。

Sqlite 使用索引进行这种类型的搜索,所以性能应该会好很多。

如果您有兴趣了解优化 sqlite 查询,此页面将解释查询优化器的工作原理。

于 2013-08-31T17:51:06.803 回答