我在 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 的人提供搜索。