【问题标题】:MYSQL - Retrieving Only Full Words From Tag SearchMYSQL - 从标签搜索中只检索完整的单词
【发布时间】:2013-07-16 00:34:01
【问题描述】:

我正在尝试从 mysql 数据库中检索条目,其中数据库中的关键字对应于文章的标题或文章的标签。目前我正在使用 instr,但这还不够具体,因为我发现对于较短的关键字检索了太多不相关的结果 - 即。我尝试检索标题或标签列表中包含“艺术”一词的条目,但最终检索到其他带有“文章”等词的条目。

我有以下表结构。数据库有一个预定义的标签列表。每个文章类别都从主标签列表中分配了一些标签:

tags_tbl (overall tags list)

    tt_tag_id (pk) int

    tt_tag  varchar

category_tag_assignments_tbl (the category which a tag is assigned to)

    cta_id (pk) int

    cta_tag_for_id (fk to tags_tbl.tt_tag_id) int

    cat_for_id (fk to category table) int

我的查询是:

SELECT * FROM tags_tbl INNER JOIN category_tag_assignments_tbl ON tags_tbl.tt_tag_id = category_tag_assignments_tbl.cta_tag_for_id WHERE instr('The Article Title' , tags_tbl.tt_tag) > 0 OR instr('these,are,article,tags' , tags_tbl.tt_tag) > 0 

我怎样才能做到这一点,以便我可以在文章标题和文章标签内搜索一个完整的单词,而不检索字符串也可能出现的较长单词,同时还考虑到这样一个事实:标签列表由没有空格的逗号分隔?我想尽量减少 php 处理的数量 - 我无法控制标题和标签的实际呈现,因为它们是由外部源提供的,除非我提前用 php 修改它们。

我正在考虑合并以下正则表达式,这是我在 stackoverflow 上找到的,但我不知道如何在这种情况下应用它,因为我在我的搜索词中搜索(对不起,我知道的措辞笨拙,但我可以'别想还能怎么说):

WHERE tags_tbl.tt_tag REGEXP '[[:<:]]art[[:>:]]'

谢谢!

【问题讨论】:

    标签: php mysql regex database


    【解决方案1】:

    首先,您可以考虑在布尔模式下进行全文搜索。这可能会比任何基于字符串的解决方案执行得更好。

    也就是说,你可以通过用分隔符包围标签和搜索字符串来做你想做的事情:

    SELECT *
    FROM tags_tbl INNER JOIN
         category_tag_assignments_tbl
         ON tags_tbl.tt_tag_id = category_tag_assignments_tbl.cta_tag_for_id
    WHERE concat(' ', 'The Article Title', ' ') like concat('%', tags_tbl.tt_tag, '%')OR
          concat(',', 'these,are,article,tags', ',') like concat('%', tags_tbl.tt_tag, '%')
    

    最后一个表达式实际上可以通过使用find_in_set() 来简化,用于以下where 子句:

    WHERE concat(' ', 'The Article Title', ' ') like concat('%', tags_tbl.tt_tag, '%')OR
          find_in_set(tags_tbl.tt_tag, 'these,are,article,tags') > 0
    

    您实际上也可以将它用于第一个表达式 - 如果标题中有逗号,这会很方便:

    WHERE find_in_set(tags_tbl.tt_tag, replace('The Article Title', ' ', ',') or
          find_in_set(tags_tbl.tt_tag, 'these,are,article,tags') > 0;
    

    【讨论】:

    • 谢谢戈登·林诺夫。 concat 事情就像我想要的那样工作。谢谢你。我还将更多地研究布尔模式。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 2021-03-31
    • 2012-10-13
    • 2014-04-02
    • 2018-04-29
    • 2012-04-23
    • 2019-04-11
    相关资源
    最近更新 更多