【问题标题】:Advanced query with MySQL Match Against使用 MySQL 匹配的高级查询
【发布时间】:2015-05-31 13:23:34
【问题描述】:

是否可以使用 Match / Against 匹配关键字,但如果它出现在特定短语中则不能?

例如,如果我想匹配“狗”而不是“热狗”:

“This is a dog”应该匹配。

“这是热狗”不应匹配。

“A hot dog is not a dog”应该匹配,因为第二个“dog”不是“hot dog”的一部分。

我的应用程序在大型数据库(约 10 万条记录)中搜索用户定义的数百个关键字,因此此查询的性能很重要。

编辑: 我只想匹配整个单词,而不是作为另一个单词的一部分出现的关键字。

【问题讨论】:

    标签: mysql match-against


    【解决方案1】:

    如果你首先replacehot dog'' 的所有出现然后在结果上执行match'dog',你应该会到达那里。比如:

    SELECT * FROM mytable WHERE MATCH (REPLACE(mycol,'hot dog','')) AGAINST ('dog');
    

    刚刚试了一下,MATCH 的工作方式似乎有所不同。它要求目标列上存在全文索引,并且只有它们才能被命名为MATCH 函数的参数。因此:我的方法不起作用。但是呢

    SELECT * FROM mytable WHERE REPLACE(mycol,'hot dog','') like '%dog%';
    

    好的,那么也许这会有所帮助

    SELECT * FROM mytable WHERE REPLACE(mycol,'hot dog','') regexp '[[:<:]]dog[[:>:]]'
    

    只查找'dog' 是单独单词的情况?

    【讨论】:

    • 好主意,但我想匹配整个单词(我应该在原始问题中提到这一点)。使用“like”,我还会将 dog 作为另一个词的一部分。
    • 谢谢,我赞成您的解决方案,但我认为它不是完全用户证明:例如,如果用户还想要“狗链”并且文本包含“热狗链”。另外,我认为正则表达式的性能不会很好地扩展。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多