【发布时间】:2012-04-30 16:15:44
【问题描述】:
我在 MySQL 5.5.22 上的多个表上运行全文查询。该应用程序使用 innodb 表,因此我创建了一些专门用于全文搜索的 MyISAM 表。
例如,我的一些表看起来像
account_search
===========
id
account_id
name
description
hobbies
interests
product_search
===========
id
product_id
name
type
description
reviews
由于这些表仅用于全文搜索,因此它们是非规范化的。数据可以来自多个表并聚合到搜索表中。除 ID 列外,其余列均分配给 1 个全文索引。
为了解决全文搜索的“50%”规则,我使用IN BOOLEAN MODE。
所以对于上述情况,我会运行:
SELECT *, MATCH(name, type, description, reviews) AGAINST('john') as relevance
FROM product_search
WHERE MATCH(name, type, description, reviews) AGAINST('john*' IN BOOLEAN MODE) LIMIT 10
SELECT *, MATCH(name, description, hobbies, interests) AGAINST('john') as relevance
FROM account_search
WHERE MATCH(name, description, hobbies, interests) AGAINST('john*' IN BOOLEAN MODE) LIMIT 10
假设我们也有名为“john”的产品:P
我面临的问题是:
为了获得有意义的相关性,我需要使用不带
IN BOOLEAN MODE的搜索。这意味着搜索受 50% 规则和字长规则的约束。因此,很多时候,如果我将product_search表中的大多数产品称为john,它们的相关性将返回为0。多个查询之间的相关性不可比较。 (我认为一个查询的相关性为 14 不等于另一个不同查询的相关性为 14)。
搜索不仅限于这两个表,还有其他“对象类型”,例如:“订单”、“交易”等。
我希望能够返回给定一组关键字的所有对象类型的前 7 个最相关的结果(1 个搜索框返回所有对象的结果)。
鉴于上述情况,有哪些算法或什至更好的想法可以获得前 7 名?
我知道我可以使用 solr 和 elasticsearch 之类的东西,我已经尝试过它们并且正在将它们集成到应用程序中,但我希望能够为那些只能访问 MySQL 的人提供搜索。
【问题讨论】:
标签: mysql algorithm full-text-search