我正在尝试实现 Faceted search或使用多标签过滤进行标记。在分面导航中,仅显示非空类别,并且类别中也匹配已应用条件的项目数显示在括号中。
I can get all items having assigned categories using INNER JOINs和 get number of items in all category using COUNT and GROUP BY ,但是我不确定它将如何扩展到数百万个对象和数千个标签。尤其是计数。
我知道有一些非关系解决方案,例如 Lucene + SOLR ,但我也发现了一些基于 RDBMS 的闭源实现,据说它们具有企业实力,例如 FacetMap.com或 Endeca软件,因此必须有一种有效的方法在关系数据库中执行分面搜索。
有没有人有分面搜索的经验并可以提供一些提示?
缓存每个类别集的计数?也许使用一些智能增量技术来更新计数器?
编辑:
可以在此处找到分面导航的示例:Flamenco .
目前我有标准的 3 表方案(如此处所述的项目、标签和 items_tags:http://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html#toxi)以及一个用于构面的表。每个标签都分配了一个方面。
最佳答案
我只能确认 Nils 所说的内容。 RDBMS 不适合多维搜索。我使用过一些智能解决方案、缓存计数器、使用触发器等。但最终,外部专用索引器总是获胜。
也许,如果您将数据转换为维度模型并将其提供给某些 OLAP [我的意思是 MDX 引擎] - 它会表现良好。但是这个解决方案似乎有点太重了,而且肯定不是实时的。
相反,使用专用索引引擎(想想 Lucene,想想 Sphinx )的解决方案可以通过增量索引更新接近实时。
关于sql - 关系数据库中分面搜索的高效实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1847909/