Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 反向搜索最佳实践?_Python_Django_Search_Reverse - Fatal编程技术网

Python 反向搜索最佳实践?

Python 反向搜索最佳实践?,python,django,search,reverse,Python,Django,Search,Reverse,我正在制作一个需要反向搜索的应用程序。我的意思是,应用程序的用户将输入搜索参数并保存它们;然后,当任何新对象输入到系统中时,如果它们与用户保存的现有搜索参数匹配,则会发送通知,以此类推 我很难找到解决这类问题的办法 我正在使用Django,并考虑使用Q对象构建搜索并对其进行酸洗,如下所述: 在我看来,当一个新对象被输入数据库时,我必须从数据库中加载每个保存的查询,并以某种方式对这个新对象运行它,以查看它是否与搜索查询匹配。。。这似乎并不理想-以前有人解决过这样的问题吗?在数据库级别,许多数据库提

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

我很难找到解决这类问题的办法

我正在使用Django,并考虑使用Q对象构建搜索并对其进行酸洗,如下所述:


在我看来,当一个新对象被输入数据库时,我必须从数据库中加载每个保存的查询,并以某种方式对这个新对象运行它,以查看它是否与搜索查询匹配。。。这似乎并不理想-以前有人解决过这样的问题吗?

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

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

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


触发器和警报进行通信的一种好方法是通过消息队列—队列(如和其他实现)将随您的站点而扩展。

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

20多年前,我们通过将存储的查询视为minidocs并根据所有必有和可能有的术语为它们编制索引来处理它们。一个新文档的术语列表被用作对这个“查询数据库”的一种查询,它构建了一个可能要运行的有趣搜索列表,然后只对新文档运行这些搜索。这听起来可能很复杂,但当存储的查询超过几个(比如10000到1000000或更多)并且您有一种支持布尔搜索和基于相似性的搜索的混合的复杂查询语言时,它大大减少了我们必须执行的完整查询数——通常不超过10或15个查询

有一件事很有帮助,那就是我们控制了整个事情。我们使用查询解析器构建了一个解析树,该解析树用于构建我们为查询编制索引的必须/可能的术语列表。我们警告客户不要在存储的查询中使用某些类型的通配符,因为这可能会导致所选查询数量激增

更新评论:

简短回答:我不确定

更详细的回答:我们正在处理一个定制的文本搜索引擎,它的部分查询语法允许以某种方式非常有效地分割文档集合,特别强调添加的日期。我们玩了很多游戏,因为我们每天要接收4-10000000个新文档,并在64MB主内存的DEC Alpha上运行多达1000000多个存储查询。(这是在80年代末/90年代初)

我猜想,可以结合上次运行查询的日期,或者在上次查询运行时使用最高的
id
来过滤与添加的日期相当的内容。如果需要对修改后的记录重新运行查询,可以使用其
id
作为查询的一部分


为了让我更具体,您必须更具体地了解您要解决的问题以及您要完成的解决方案的规模。

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

您的“必须有”和“可能有”搜索词概念对于减少必须针对新文档运行的保存的搜索数量非常有意义。问题的第二部分与django更相关——假设您有一个模型实例——为了确定布尔匹配,如何准确地针对这一实例运行过滤器/查询?+1,我一直在考虑这个问题的解决方案,并得出了相同的解决方案。尽管我仍在寻找其他可能的解决方案,但这种设计比检查每个存储的查询是否与新条目匹配要好得多。谢谢你的发帖。想想看,如果你把它当作一个cron任务来做,或者使用芹菜/类似的东西在保存过程之外处理新的项目,你就不必担心扩展问题了。