[英]Efficient Filtering / Searching
我们有一个托管应用程序来管理内容页面。 每个页面可以有许多自定义字段,以及一些标准字段(时间戳,用户名,用户电子邮件等)。
可能有数百个不同的站点使用该系统 - 处理过滤/搜索的有效方法是什么? 画出要缩小的网格视图。 您可以筛选特定字段(用户ID,日期),也可以输入全文搜索。
例如,“由userid 10启动的所有页面”将是对MySQL数据库的非常快速的查询。 但是诸如“由用户ID为10且匹配[某些搜索查询]”的用户启动的所有页面都会对数据库产生影响,因此它适用于像Lucene这样的搜索引擎。
基本上我想知道其他大型网站是如何做这种事情的。 他们是否100%使用搜索引擎进行所有类型的过滤? 他们是否将数据库查询与搜索引擎混合?
如果我们仅使用搜索引擎,则新的/更新的对象在搜索索引中出现的延迟时间会出现问题。 也就是说,我已经读过, 立即更新索引是不明智的,而是分批进行。 即使这意味着每5分钟一次,当用户查看简单的页面列表时(例如“类别:5”的搜索查询),当他们最近添加的页面没有立即列出时,用户会感到困惑。
我们正在使用MySQL,并一直在密切关注Lucene的搜索。 还有其他一些我不知道的技术吗?
我的想法是提供一个简单的过滤页面,它使用MySQL来过滤基本字段。 然后提供一个单独的全文搜索页面,其中会显示与Google类似的结果。 这是唯一的方法吗?
Solr或grassyknoll都为Lucene提供了更抽象的接口。
那说:是的。 如果您是一个主要由内容驱动的网站,提供全文搜索您的数据,那么除了LIKE之外还有其他一些功能。 虽然MySql的FULLTEXT索引不完美,但在过渡期间它可能是一个可接受的占位符。
假设您确实创建了一个Lucene索引,将Lucene文档链接到关系对象非常简单,只需在索引时将存储的属性添加到文档中(此属性可以是URL,ID,GUID等)然后,搜索变为2阶段系统:1)向Lucene索引发出查询(显示简单的结果,如标题)2)通过密钥从关系存储中获取有关对象的更多详细信息
由于在Lucene中实例化文档的成本相对较高,因此您只想存储在Lucene索引中搜索的字段,而不是完整的关系对象克隆。
不要轻易注销MySQL!
使用数据库实现它,例如where子句中的“like”选择或其他。
对其进行配置,必要时添加索引。 推出测试版,这样您就可以从用户的实际数据模式中获得实数 - 并非所有列都可以在之后同等地询问,等等。
如果性能确实很糟糕,那么在考虑其他选项时就是这样。 您可以考虑调整SQL,数据库,运行数据库的机器,最后使用其他技术堆栈...
如果您想使用MySQL或PostgreSQL,可以使用它的开源解决方案是Sphinx: http : //www.sphinxsearch.com/
我们遇到了同样的问题,并将Sphinx和Lucene视为可能的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.