【问题标题】:How to extract tags from strings如何从字符串中提取标签
【发布时间】:2014-02-26 17:50:43
【问题描述】:

我使用 PHP、PDO 扩展和 MySQL 作为默认 DBMS。我还有一个准备好的标签表,在我的数据库中有两个 idtag 列。

我的目的是“从标签表中存在的字符串中自动提取匹配的标签”,我的问题是通过 PDO 查询来执行该操作。

例如,如果字符串是 "An Expensive And High Quality Computer hardware" ,在删除少于 3 个字符的单词后,如果我执行如下查询:SELECT id FROM tags WHERE tag LIKE %Expensive%And%High%Quality%Computer%; ,像 "expensive" 或 "computer" 这样的文字标签将没找到!

同样执行SELECT id FROM tags WHERE tag='expensive' OR tag='and' OR tag='high' OR tag='quality' OR tag='computer' OR tag='hardware'; 之类的查询不会包含“高质量”或“昂贵硬件”之类的标签。

每个字符串都会执行一次此查询,在这种情况下处理时间无关紧要。

提前谢谢你,抱歉我的解释不好。

【问题讨论】:

  • % 不是这样工作的,在大型数据集上将 OR 链接在一起非常痛苦。

标签: php mysql string tags extract


【解决方案1】:

你几乎拥有它;只需在每个术语周围加上通配符:

SELECT id 
FROM tags 
WHERE tag='%expensive%' 
    OR tag='%high%' 
    OR tag='%quality%' 
    OR tag='%computer%'
    OR tag='%hardware%';

请注意,我从条款中排除了“和”。您可能想要检查字符串长度并且不要使用任何 3 个字符或更少的字符,因为 "%and%" 会匹配很多东西,例如 "sandy" "bland" "grandiose" 等。

【讨论】:

  • Thanx @digital-chris 但还有另一个小问题。这个结果将包含“昂贵的工具”之类的标签,这不是我真正期望的!
  • 我建议“昂贵的工具”和“昂贵的计算机”是不好的标签,只标记“工具”和“计算机”
  • 是的,我同意你的观点,但是这些标签是我的客户收集的,我没有时间过滤它们。有没有办法限制这个结果,以便选择只包含给定单词的多文字标签
  • 您同时要求两件事:排除性(“昂贵的计算机”但不是“昂贵的工具”)和包容性(“高质量的硬件”和“昂贵的计算机”)......你可以不要同时做这两件事。您可能需要多次通过,例如首先搜索顶级类别,然后搜索该类别下的标签。
  • 那么用建议的查询从数据库中获取相似的标签,然后用 PHP 将每个结果分解为单个单词并对其进行操作以确保只包含给定的单词,这是个好主意吗?
【解决方案2】:

我认为你可以使用类似的东西:

SELECT id FROM tags WHERE tag LIKE '%expensive%' OR tag LIKE '%and%' OR tag LIKE '%high%' OR tag LIKE '%quality%' OR tag LIKE '%computer%' OR tag LIKE '%hardware%';

在您的查询中,您将搜索限制为精确的词,例如 tag='hardware'。这与昂贵的硬件不匹配。

【讨论】:

    猜你喜欢
    • 2021-07-30
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    相关资源
    最近更新 更多