puk*_*978 7 mysql full-text-search
我有一个搜索查询,它在数据库上执行全文搜索.
$sql = "SELECT
*
FROM
`tbl_auction_listing` AS `al`
JOIN
`tbl_user` AS `u` ON `al`.`user_id` = `u`.`user_id`
LEFT JOIN
`tbl_gallery_details` AS `gd` ON `al`.`user_id` = `gd`.`user_id`
LEFT JOIN
`tbl_self_represented_details` AS `sr` ON `u`.`user_id` = `sr`.`user_id`
WHERE
`al`.`status` = '" . ACTIVE . "'
AND
`al`.`start_date` < NOW()
AND
`al`.`end_date` > NOW()
AND
MATCH(`al`.`listing_title`,
`al`.`description`,
`al`.`provenance`,
`al`.`title`,
`al`.`artist_full_name`,
`al`.`artist_first_name`,
`al`.`artist_last_name`,
`sr`.`artist_name`,
`gd`.`gallery_name`,
`u`.`username`) AGAINST('$search_query' IN BOOLEAN MODE)";
Run Code Online (Sandbox Code Playgroud)
当我搜索'Cardozo,Horacio'或'cardozo'或'horacio'时,我没有得到任何结果,但我知道在db中有一个艺术家有2条记录,其中artist_full_name = Cardozo,Horacio.
如果我删除所有MATCH字段并且只是al.artist_full_name我得到2个结果.如果我加入al.description我得到1个结果因为'Horacio Cardozo'存在于描述中.
如果在任何MATCH字段中满足任何条件(任何搜索查询字),是否有办法让搜索返回所有记录?我尝试删除IN BOOLEAN MODE但产生了相同的结果.
Ran*_*eed 21
似乎InnoDB表不允许在相同MATCH()条件下搜索多个全文索引.
在这里,您的字段并不都属于同一个表,因此它们由不同的索引覆盖.请注意,如果您有这样的表,则同样的限制适用:
CREATE TABLE t (
f1 VARCHAR(20),
f2 VARCHAR(20),
FULLTEXT(f1), FULLTEXT(f2)
) ENGINE=InnoDB;
SELECT * FROM t
WHERE MATCH(f1, f2) AGAINST ('something in f2'); -- likely to return no row
Run Code Online (Sandbox Code Playgroud)
它看起来像一个全文检索可以在它遇到的第一个全文索引只能搜索,但是这仅仅是我的东西扣除这方面的经验,请不要认为这是理所当然的.
底线是你应该拆分你的搜索,以便每个MATCH()子句使用一个单一的全文索引:
SELECT * FROM auction, user, gallery, ...
WHERE
MATCH(auction.field1, auction.field2) AGAINST ('search query' IN BOOLEAN MODE) OR
MATCH(auction.field3) AGAINST ('search query' IN BOOLEAN MODE) OR
MATCH(user.field1, user.field2, user.field3) AGAINST...
Run Code Online (Sandbox Code Playgroud)
如果您有两个不同的索引,auction并且一个在上,则可以查询可能的查询user.您需要根据实际结构进行调整(如果您需要更多指导,请发布表格说明).
请注意,这仅适用于InnoDB表.有趣的是,MyISAM表似乎没有显示出相同的限制.
更新:事实证明这是InnoDB引擎中的一个错误,修复于5.6.13/5.7.2.上面的示例现在正确地失败,"找不到与列列表匹配的FULLTEXT索引".实际上,没有索引(f1, f2),但一个在上(f1),另一个在上(f2).正如变更日志所建议:
与MyISAM不同,InnoDB不支持对非索引列进行布尔全文搜索,但未强制执行此限制,导致查询返回不正确的结果.
值得注意的是,虽然此类查询使用MyISAM返回正确的结果集,但它们运行速度比人们预期的要慢,因为它们默默地忽略现有的全文索引.
| 归档时间: |
|
| 查看次数: |
15137 次 |
| 最近记录: |