Python中最快的文本搜索

时间:2013-08-30 20:28:20

标签: python sqlite search flask typeahead

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我的回答并未告诉您如何在内存中进行搜索,因为我认为您可以采取一些措施来改进数据库搜索,这些内容在正确实施后非常有效。

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

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

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

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

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

Sqlite使用索引进行此类搜索,因此性能应该更好。

如果您有兴趣了解优化sqlite查询this page,请说明查询优化器的工作原理。