【问题标题】:How to use a full text index for exact matches?如何使用全文索引进行精确匹配?
【发布时间】:2012-03-23 18:01:48
【问题描述】:

我有一个带有全文索引的 MySql MyISAM 表,如下所示:

CREATE TABLE `tblsearch` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `title` varchar(100) NOT NULL,
    `brand` varchar(100) DEFAULT NULL,
    PRIMARY KEY (`id`),
    FULLTEXT KEY `index_all` (`title`,`brand`)
) ENGINE=MyISAM AUTO_INCREMENT=1316109 DEFAULT CHARSET=utf8;

现在我需要编写这样的查询来查找具有确切标题和品牌的所有条目:

SELECT id FROM tblsearch WHERE title=?title AND brand=?brand;

查询只给出完全匹配是很重要的。我希望能够使用我已经拥有的全文索引。是否可以编写查询使其使用全文索引?

【问题讨论】:

    标签: mysql full-text-search myisam


    【解决方案1】:

    类似这样的:

    SELECT id 
      FROM tblsearch 
     WHERE MATCH (title, brand) AGAINST ("exact phrase") 
       AND CONCAT(title, ' ', brand) LIKE '%exact phrase%';
    

    希望对你有帮助

    【讨论】:

    • 我需要 ?title 和 ?brand 作为两个不同的参数,这可能吗?
    • 你的代码尝试结合标题和品牌参数,并使用它来代替“精确短语”..
    • 好的,谢谢!是否可以像在此查询中那样使用“like '%exact phrase%'”部分,还是对性能不利?该表有大约 +100 万个条目。
    【解决方案2】:

    如果您需要找到确切的标题或品牌,则需要使用带有经典索引的等号运算符:

    ALTER TABLE tblsearch ADD INDEX search_idx(title, brand);
    SELECT id FROM tblsearch WHERE title = 'foo' AND brand = 'bar';
    

    现在,如果您只需要在标题和品牌中匹配确切的词:

    SELECT id FROM tblsearch WHERE
    MATCH(title) AGAINST('+foo' IN BOOLEAN MODE)
    AND MATCH(brand) AGAINST('+bar' IN BOOLEAN MODE);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 2021-10-01
      相关资源
      最近更新 更多