18

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

我可以使用 INNER JOIN 获取所有已分配类别的项目,并使用 COUNT 和 GROUP BY 获取所有类别中的项目数,但是我不确定它将如何扩展到数百万个对象和数千个标签。尤其是计数。

我知道有一些像Lucene + SOLR这样的非关系型解决方案,但我还发现了一些基于 RDBMS 的闭源实现,据说是像FacetMap.comEndeca软件这样的企业实力,所以必须有一个在关系数据库中执行分面搜索的有效方法。

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

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

编辑:

可以在此处找到分面导航的示例:弗拉门戈舞

目前我有标准的 3 表方案(项目、标签和 items_tags,如下所述:http ://www.pui.ch/phred/archives/2005/04/tags-database-schemas.html#toxi )加上一个表对于方面。每个标签都分配了一个方面。

4

4 回答 4

6

我只能确认尼尔斯所说的话。RDBMS 不适合多维搜索。我曾使用过一些智能解决方案、缓存计数器、使用触发器等。但最终,外部专用索引器总是胜出。

也许,如果您将数据转换为维度模型并将其提供给一些 OLAP [我的意思是 MDX 引擎] - 它会表现良好。但这似乎有点过于繁重的解决方案,而且肯定不是实时的。

相反,具有专用索引引擎的解决方案(想想 Lucene,想想Sphinx)可以通过增量索引更新实现近乎实时的。

于 2009-12-04T16:46:41.717 回答
5

IMO,关系数据库不擅长搜索。您将从专用搜索引擎(如 Solr/Lucene)获得更好的性能。

于 2009-12-04T16:08:56.900 回答
5

分面搜索是一个分析问题,这意味着维度设计是一个不错的选择。又名,您搜索的内容必须是表格形式。

在分析表中包括所有感兴趣的列。

将连续值放入桶中。

对“许多”项目(如类别或标签)使用布尔列,例如,如果有三个标签“foo”、“bar”和“baz”,您将拥有三个布尔列。

使用物化视图创建分析表。

索引它的废话。一些数据库支持此类应用程序的索引。

只过滤一次。

联合你的结果。

为常见查询构建预聚合物化视图。

这篇文章也可能对您有所帮助:https ://blog.jooq.org/2017/04/20/how-to-calculate-multiple-aggregate-functions-in-a-single-query/

with filtered as (
    select
    *
    from cars_analytic
    where
        [some search conditions]
)

--for each facet:

select
    'brand' as facet,
    brand as value,
    count(*) as count
from
    filtered
group by
    brand

union

select
    'cool-tag' as facet,
    'cool-tag'as value,
    count(*) as count
from
    filtered
where
    cool_tag

union

...


-- sort at the end
order by
    facet,
    count desc,
    value

在约 150 毫秒内包含 5 个方面的 100,000 条记录

于 2015-09-03T20:02:16.550 回答
0

关于计数,为什么要通过 SQL 提取它们?无论如何,您都必须遍历代码中的结果集,那么为什么不在那里进行计数呢?

我目前正在我正在开发的多面搜索应用程序中使用这种方法,并且运行良好。唯一棘手的部分是设置您的代码,使其在到达新方面之前不输出方面。那时,输出你为它找到的构面和行数。

这种方法假设您要拉回所有匹配项目的列表,因此,具有相同构面的多行。当您按方面订购此结果时,很容易在您的代码中获得计数。

于 2009-12-07T15:44:23.943 回答