sql - 关系数据库中分面搜索的高效实现

标签 sql database database-design tagging faceted-search

我正在尝试实现 Faceted search或使用多标签过滤进行标记。在分面导航中,仅显示非空类别,并且类别中也匹配已应用条件的项目数显示在括号中。

I can get all items having assigned categories using INNER JOINsget number of items in all category using COUNT and GROUP BY ,但是我不确定它将如何扩展到数百万个对象和数千个标签。尤其是计数。

我知道有一些非关系解决方案,例如 Lucene + SOLR ,但我也发现了一些基于 RDBMS 的闭源实现,据说它们具有企业实力,例如 FacetMap.comEndeca软件,因此必须有一种有效的方法在关系数据库中执行分面搜索。

有没有人有分面搜索的经验并可以提供一些提示?

缓存每个类别集的计数?也许使用一些智能增量技术来更新计数器?

编辑:

可以在此处找到分面导航的示例: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/

相关文章:

mysql - 为 MySQL 中的临时表授予选择

java - 在支持 UTF-8 的 Java 中解析 SQL 查询

python - DJANGO 在保存时添加 NULL - IntegrityError at/****/(1048, "***' 不能为 null")

php - 使用mysql数据库详细信息访问亚马逊mysql数据库

php - "No database selected"问题

ms-access - MS Access 中的一对一关系

java - 使用 Hibernate 进行分层数据版本控制的好的数据库设计是什么?

mysql - 临时表自动递增

Android数据库插入特定行

MySQL - 1 列表