【问题标题】:MYSQL advance searching - order by with LIKE operatorMYSQL 高级搜索 - 使用 LIKE 运算符排序
【发布时间】:2017-09-26 08:17:01
【问题描述】:
SELECT title
FROM team
WHERE
title LIKE '%la fontaine e%' OR 
MATCH(title, title_fr, summary, seo_keyword, seo_description) AGAINST('(+la +fontaine +e) (la fontaine e)' IN BOOLEAN MODE) 
ORDER BY title LIKE '%la%' OR title LIKE '%fontaine%' OR title LIKE '%e%' ASC;

结果

我想弹出结果,以使以下行排在第一位

La fontaine à eau Edelvia Home 11L
La fontaine à eau Edelvia Home 11L livrée à domicile

结果将根据键入的关键字进行过滤和排序。

【问题讨论】:

    标签: mysql sql-order-by sql-like


    【解决方案1】:

    如果title-列不包含您的任何搜索词,您的布尔表达式将为1,否则为0。因此,您必须将asc 更改为desc 才能在0 之前订购1

    like 不会考虑字边界,因此LIKE '%e%' 对于包含e 任何位置 的任何值都是正确的(例如home)。这意味着即使您确实asc 更改为desc,至少对于您的示例数据,您仍然会得到任意顺序,因为每一行确实在某处包含e ,因此您的布尔表达式对所有结果都为真。

    您可能需要考虑例如order by (title LIKE '%la%') + (title LIKE '%fontaine%') + (title LIKE '%e%') desc 或类似的东西,所以更多(部分)关键字匹配会导致更好的位置。否则,添加更多关键字可能会使您的订单变得更糟:搜索"fontaine" 订单符合预期,搜索"fontaine e" 再次没有订单。

    如果您确实想要尊重单词边界,那么如果您基本上想要进行全文搜索,优先考虑title 列进行排序,您可能需要使用实际相关性分数来对结果进行排序。它应该(可能)给你一个比“它包含任何搜索词”更好的顺序。尝试例如

    order by MATCH(title) 
    AGAINST('(+la +fontaine +e) (la fontaine e)' IN BOOLEAN MODE) DESC
    

    order by MATCH(title) 
    AGAINST('(+la +fontaine +e) (la fontaine e)' IN BOOLEAN MODE) DESC,
    MATCH(title, title_fr, summary, seo_keyword, seo_description) 
    AGAINST('(+la +fontaine +e) (la fontaine e)' IN BOOLEAN MODE) DESC
    

    order by MATCH(title) 
    AGAINST('(+la +fontaine +e) (la fontaine e)' IN BOOLEAN MODE) * 5 
    + MATCH(title, title_fr, summary, seo_keyword, seo_description) 
    AGAINST('(+la +fontaine +e) (la fontaine e)' IN BOOLEAN MODE) DESC
    

    这将要求您在 title 上添加单独的全文索引。

    您还应该了解全文搜索的限制和选项。例如,默认情况下,索引将不包含比3 (for InnoDB)4 (for MyISAM) 短的单词,因此ela 将不会包含在索引中并且无法找到。此外,像the 这样的一些常用词通过stopword list 被排除在外(该停用词列表的默认内容对于MyISAM 和InnoDB 会有很大不同)。此外,全文索引会越慢,它会找到更多的结果。因此,搜索单个稀有词非常快,而搜索将返回大部分数据的几个关键词的组合可能会(取决于表的大小)变得非常缓慢。

    附注:title LIKE '%la fontaine e%' 与查找单独的单词不同 - 它会查找例如'Isabella Fontaine est' 也是。并且您的match against-part 也将包含结果,因为它包含单词Fontaine。虽然这仅在您搜索超过 2 个单词时才成立,否则,title LIKE '%la fontaine%' 将找到不包含单词 lafontaine'Isabella Fontainebleau'。我不确定这是否是您想要或期望的行为。

    【讨论】:

    • 现在查询变为 SELECT title FROM team WHERE MATCH(title, title_fr, meta_tags, summary, seo_keyword, seo_description) AGAINST('(+la +fontaine +eau) (la fontaine eau)' IN BOOLEAN MODE ) OR title LIKE '%la fontaine eau%' ORDER BY MATCH(title) AGAINST('(+la +fontaine +eau) (la fontaine eau)' IN BOOLEAN MODE) DESC;但第一排是 - Fontaine à eau pour chien et chat Fresh & Clear Dogit 设计和愿望从第二到第三排 - La fontaine à eau pour chats et chiens Vega - La fontaine à eau Edelvia Home 11L - La fontaine à eau Edelvia Home 11L livrée à domicile
    • 如果我正确理解您的后续操作:如果您搜索“la fontaine eau”,则“la”一词(如果您使用 MyISAM,则可能是“eau”一词)是(由默认)被忽略,因为它比 3 或 4 短(我在限制部分提到过,你可能错过了;它还包括指向配置设置的链接)。如果您希望它对全文分数有任何影响,您必须更改配置选项,然后重建您的索引。如果这不是你的问题,那你得再澄清一下,因为我当时不明白。
    【解决方案2】:

    我已经为这些列定义了 全文 索引。 现在查询变成了

    SELECT title
    FROM team
    WHERE 
    MATCH(title, title_fr, meta_tags, summary, seo_keyword, seo_description) AGAINST('(+la +fontaine +eau) (la fontaine eau)' IN BOOLEAN MODE) 
    OR title LIKE '%la fontaine eau%' 
    ORDER BY MATCH(title) AGAINST('(+la +fontaine +eau) (la fontaine eau)' IN BOOLEAN MODE) DESC;
    

    但第一行是

    - Fontaine à eau pour chien et chat Fresh & Clear Dogit Design
    

    并且希望从第二个到以后的行

    - La fontaine à eau pour chats et chiens Vega
    - La fontaine à eau Edelvia Home 11L
    - La fontaine à eau Edelvia Home 11L livrée à domicile
    

    【讨论】:

    • 如果我正确理解您的后续操作:如果您搜索“la fontaine eau”,则“la”一词(如果您使用 MyISAM,则可能是“eau”一词)是(由默认)被忽略,因为它比 3 或 4 短(我在限制部分提到过,你可能错过了;它还包括指向配置设置的链接)。如果您希望它对全文分数产生任何影响,则必须更改配置选项,然后重建索引。如果这不是你的问题,那你得再澄清一下,因为我当时不明白。
    猜你喜欢
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多