反向搜索最佳实践?

时间:2010-03-12 08:07:14

标签: python django search reverse

我正在制作一个需要反向搜索的应用。通过这个,我的意思是应用程序的用户将输入搜索参数并保存它们;然后,当任何新对象进入系统时,如果它们与用户保存的现有搜索参数匹配,则会发送通知等。

我很难找到解决此类问题的方法。

我正在使用Django并考虑构建搜索并使用Q对象对其进行搜索,如下所示:http://www.djangozen.com/blog/the-power-of-q

我看到它的方式,当一个新对象进入数据库时​​,我将不得不从db加载每个单独保存的查询,并以某种方式针对这一个新对象运行它以查看它是否与该搜索查询匹配。 ..这似乎并不理想 - 有没有人解决过这样的问题?

3 个答案:

答案 0 :(得分:4)

在数据库级别,许多数据库都提供“触发器”。

另一种方法是定时作业,定期从数据库中获取自上次运行以来具有上次修改日期的所有项目;然后这些被过滤并发出警报。您也许可以将一些过滤放入数据库中的查询语句中。但是,如果项目已删除,则需要发送通知时,这有点棘手。

您还可以手动将触发器放入向数据库提交数据的代码中,这可能更灵活,当然也不依赖于数据库的特定功能。

触发器和警报通信的好方法是通过消息队列 - RabbitMQ和其他AMQP实施等队列将随您的站点扩展。

答案 1 :(得分:4)

您用于解决此问题的工作量与您正在处理的存储查询的数量直接相关。

20多年前,我们处理了存储的查询,将它们视为minidocs并根据所有必须可能的索引对它们进行索引条款。一个新的doc的术语列表被用作对这个“查询数据库”的一种查询,并构建了一个可能有趣的搜索列表来运行,然后只针对新文档运行那些搜索。这可能听起来很复杂,但是当存在多个存储的查询(比如10,000到1,000,000或更多)时,你有一个复杂的查询语言支持布尔和基于相似性的搜索的混合,它大大减少了我们作为全面查询执行的数量 - 通常不超过10或15个查询。

有一件事有助于我们控制了整个事物的horizontal and the vertical。我们使用查询解析器来构建一个解析树,用于构建必须/可能包含我们索引查询的术语的列表。我们警告客户不要在存储的查询中使用某些类型的通配符,因为它可能会导致所选查询数量激增。

评论更新:

简短回答:我不确定。

更长的答案:我们正在处理自定义构建的文本搜索引擎,其部分查询语法允许以非常有效的方式切片文档集合,特别强调date_added。我们玩了很多游戏,因为我们每天摄取4-10,000,000个新文档,并在DEC Alphas上运行它们以及64,000个主内存的多达1,000,000个存储查询。 (这是在80年代末/ 90年代初期。)

我猜测过滤相当于date_added的内容可以与上次运行查询的日期结合使用,也可以在最后一次查询运行时使用最高id。如果您需要针对修改后的记录重新运行查询,则可以使用其id作为查询的一部分。

让我更具体一点,你将需要更准确地了解你想要解决的问题以及你正在尝试完成的解决方案的规模。 lot

答案 2 :(得分:1)

如果您将每个存储的搜索中涉及的对象类型存储为generic relation,则可以向所有涉及的对象添加保存后signal。当信号触发时,它只查找涉及其对象类型的搜索并运行它们。如果你有大量的数据库写入和大量已保存的搜索,这可能仍会遇到扩展问题,但这将是一个简单的Django方法。