【问题标题】:Common words filtering常用词过滤
【发布时间】:2021-12-17 18:58:27
【问题描述】:

我正在尝试在 php 和数据库服务器 mysql 中创建“按字母过滤”功能。 表;

+-----+---------------------+
| nid | title               |
+-----+---------------------+
|   1 | Home and Services   |
|   2 | Health and services |
|   3 | Health and Medical  |
|   4 | Health and Allergy  |
|   5 | Stroke Services     |
+-----+---------------------+

但我想过滤掉“和”“服务”等常用词。因此,例如,如果用户按字母“S”进行过滤,它应该返回“Stroke Services”,但应该排除“Home and Services”和“Health and services”。

我怎样才能做到这一点?这是我当前的查询;

SELECT nid,title FROM node_field_data WHERE BINARY title LIKE "%S%%" AND BINARY title NOT LIKE "%Services%";

但它也排除了“中风服务”。请帮忙。

【问题讨论】:

  • 坐下来想想你的过滤器应该做什么。写下来。最后,将其转换为 SQL 查询。
  • Regexp_like 可能会帮助你。与常规类似的 SQL 模式匹配并不是那么好。 NOT LIKE "%Services%" 也应该类似于 NOT LIKE "%and _ervices%" - 我不确定这是否可行
  • 设计一个过滤条件有点困难,有时你想排除某个词,但在其他情况下你想包含它。此外,您当前的方法要求您为每个排除标准手动设计模式(或模式组合)。我不认为这是可持续的。您可能需要查看布尔全文搜索并提供停用词列表。
  • 为什么不创建一个包含该字符串“允许”部分的列,并在更改title 列时对其进行更新?这可以使查询更容易过滤行

标签: mysql select filter


【解决方案1】:

我能够在单个查询中实现这一点。实际上我有三个过滤条件;

  1. 获取所有以选定字母开头的标题,例如'A'。
  2. 获取所有标题,其中任何单词以字母开头,例如'A'。
  3. 忽略“and”、“or”、“at”、“the”等常用词。

在我的 mysql 查询中将它们分为两组。 (第 1 组检查标准 #1 和 #2)AND(第 2 组符合标准 #3)。以下是寻找类似内容的任何人的查询。

SELECT nid, title FROM node_field_data WHERE (BINARY title LIKE "A%" OR BINARY title LIKE "% A%%") AND (title NOT REGEXP "and|or|at|the")

在我的例子中,内容版主在 CMS 中获得了一个工具,他们可以在其中定义要为每个字母排除的常用词。像下面这样;

A|and,at,again
C|care, can, could
S|services

等等……

【讨论】:

  • 这不会像你期望的那样工作:首先,“random”将匹配“and”。此外,您要求标题不包含单词“and”。因此,“Me and Annie”将匹配“单词以A开头并且标题不包含and”,因为标题确实包含。在这个例子中,“随机取消关联”将变成不包含任何以 A 开头的单词(并且不包含任何以 C 开头的单词)......这显然是不正确的。
  • 感谢您的帮助,我会试一试您的问题。但我的工作正常在这里你可以看到它在行动:ibb.co/2q6JzsT。我现在唯一关心的是你给出的“随机”例子。谢谢你,我想我得稍微调整一下我的正则表达式来解决这个问题。
  • @LSerni,不,它没有显示“MySQL 并再次...”这就是我在 gif 中强调的内容。如果您再次仔细查看,首先会显示所有记录,当我提供字母“M”时,ID #7 消失了,因为它包含“and”,根据标准 3,它应该排除它,因此它确实如此。
  • 我明白了。我的不好,很抱歉;这是我从未遇到过的标准,所以我误解了它(我确认我的解决方案不起作用 - 所以,我删除了它 - 因为它忽略了空词“and”、“or”等,但匹配了其他的,而不是忽略任何地方包含空词的所有文本)。对于“and”不匹配“random”,您可以使用NOT REGEXP '\\b(and|or|services)\\b',其中 \\b 是单词边界匹配。
  • 不过,为了清楚起见,我认为最好将3. Ignore the common words like 'and', 'or', 'at', 'the' etc. 改写为3. Ignore **all titles** containing common words like...,并且可能还包括您在 cmets 中给出的示例:当寻找 包含以 M 开头的单词的标题,不应找到标题“MySQL and something”,而应找到“MySQL something else”。
猜你喜欢
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多