反向搜索最佳实践?

2024-05-14 10:22:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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


Tags: the对象django用户com数据库应用程序http
3条回答

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

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

另一种方法是让定时作业定期从数据库中获取自上次运行以来具有最后修改日期的所有项目;然后对这些项目进行筛选并发出警报。您也许可以在数据库的查询语句中添加一些筛选。但是,如果需要在项目被删除时发送通知,这就有点棘手了。在

当然,你也不能把更灵活的数据提交到数据库中,这也不需要你手动地把数据放到数据库中。在

触发器和警报进行通信的一种好方法是通过消息队列进行通信,例如RabbitMQ和其他{a2}实现将随站点的不同而扩展。在

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

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

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

更新评论:

简而言之:我不确定。在

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

我猜,对date_added等效的过滤可以与您上次运行查询的日期结合使用,或者可能是上次查询运行时的最高值{}。如果需要对修改过的记录重新运行查询,可以将其id作为查询的一部分。在

我想说得更具体,你需要更具体地了解你到底想解决什么问题,以及你要完成的解决方案的规模。在

相关问题 更多 >

    热门问题