高效过滤/搜索

Posted

技术标签:

【中文标题】高效过滤/搜索【英文标题】:Efficient Filtering / Searching 【发布时间】:2010-09-23 02:14:51 【问题描述】:

我们有一个托管应用程序来管理内容页面。每个页面可以有许多自定义字段,以及一些标准字段(时间戳、用户名、用户电子邮件等)。

可能有数百个不同的网站在使用该系统——处理过滤/搜索的有效方法是什么?想象一个您想要缩小范围的网格视图。您可以过滤特定字段(用户 ID、日期),也可以输入全文搜索。

例如,“所有由 userid 10 开始的页面”将是对 mysql 数据库的非常快速的查询。但是诸如“用户 ID 为 10 且匹配 [某些搜索查询] 的用户启动的所有页面”之类的内容会影响数据库,因此它适合 Lucene 之类的搜索引擎。

基本上我想知道其他大型网站是如何做这种事情的。他们是否 100% 使用搜索引擎进行所有类型的过滤?他们是否将数据库查询与搜索引擎混合在一起?

如果我们使用搜索引擎,则会出现新/更新对象出现在搜索索引中的延迟时间问题。也就是说,我读到立即更新索引并不明智,而是分批进行。即使这意味着每 5 分钟一次,当用户查看一个简单的页面列表(比如搜索查询“category:5”)时,如果他们最近添加的页面没有立即列出,他们也会感到困惑。

我们正在使用 MySQL,并且一直在密切关注 Lucene 进行搜索。还有其他我不知道的技术吗?

我的想法是提供一个简单的过滤页面,它使用 MySQL 来过滤基本字段。然后提供一个单独的全文搜索页面,该页面将显示类似于 Google 的结果。这是唯一的方法吗?

【问题讨论】:

【参考方案1】:

Solr 或 Grassyknoll 都为 Lucene 提供了更抽象的接口。

也就是说:是的。如果您是一个主要内容驱动的网站,提供对您的数据的全文搜索,那么除了 LIKE 之外,还有一些东西在起作用。虽然 MySql 的 FULLTEXT 索引并不完美,但在此期间它可能是一个可接受的占位符。

假设您确实创建了一个 Lucene 索引,将 Lucene 文档链接到您的关系对象非常简单,只需在索引时向文档添加一个存储属性(此属性可以是 url、ID、GUID 等)然后,搜索变成一个两相系统: 1)向Lucene索引发出查询(显示简单的结果,如标题) 2)通过它的键从关系存储中获取有关对象的更多详细信息

由于文档的实例化在 Lucene 中相对昂贵,因此您只想存储在 Lucene 索引中搜索的字段,而不是关系对象的完整克隆。

【讨论】:

【参考方案2】:

不要轻易注销 MySQL!

使用数据库来实现它,例如在 where 子句或其他任何内容中带有“like”的选择。

对其进行分析,必要时添加索引。推出测试版,这样您就可以从用户的实际数据模式中获得实数 - 并非所有列都可能被同等询问,等等。

如果性能确实很差,那就是您考虑其他选择的时候了。您可以考虑调整您的 SQL、您的数据库、运行数据库的机器,最后使用另一个技术堆栈...

【讨论】:

【参考方案3】:

如果您想使用 MySQL 或 PostgreSQL,可以使用它的开源解决方案是 Sphinx: http://www.sphinxsearch.com/

我们遇到了同样的问题,并考虑将 Sphinx 和 Lucene 作为可能的解决方案。

【讨论】:

以上是关于高效过滤/搜索的主要内容,如果未能解决你的问题,请参考以下文章

如何高效搜索github开源项目

高效的在GitHub搜索开源项目

linux搜索过滤--grep

具有大型(70,000+ 项)数据集的高效 jQuery 实时搜索

有赞搜索系统的架构演进

Angular使用总结 --- 搜索场景中使用rxjs的操作符