【问题标题】:MySQL Full Text Search Match Against Query AND OR Column1 = ABCMySQL 全文搜索匹配查询 AND OR Column1 = ABC
【发布时间】:2016-12-10 17:58:28
【问题描述】:

这行得通;

SELECT MATCH('Col1', 'Col2') AGAINST('search query') AS Score, Col1, Col2, Col3 
FROM my_table 
WHERE 
Col1 = 'something-1' 
OR 
Col2 = 'something-2' 
OR 
MATCH('Col1', 'Col2') AGAINST ('search query') HAVING Score > 2;

这不是;

SELECT MATCH('Col1', 'Col2') AGAINST('search query') AS Score, Col1, Col2, Col3 
FROM my_table 
WHERE 
Col1 = 'something-1' 
OR 
Col2 = 'something-2' 
OR 
MATCH('Col1', 'Col2') AGAINST ('search query') HAVING Score > 2 
AND Col3 = 'something3';

我不确定这是否会带来我想要的确切结果,尽管这是主要问题:如何将 Match Against 与 AND 一起使用,最重要的是,将事物与(括号)有效地链接在一起以优先考虑正确的混合;

(X = 1 OR Y = 2 OR MATCH('Col1', 'Col2') AGAINST ('search query') HAVING Score > 2) AND Z = 3

到目前为止,从我对每种组合的测试来看,我还没有设法让它有效地发挥作用。我正在尝试扩展当前仅使用 AND 和 OR 的当前复杂查询,以包括具有一定质量的 MATCH AGAINST 信息。

必须有一个正确的方法来做这件事,而我做得不好。

更新 1 有趣的是,当我执行建议的查询并首先使用 AND 语句时,如下所示;

Col3 = 'something3' AND
(
    Col1 = 'something-1' 
    OR 
    Col2 = 'something-2' 
    OR 
    MATCH('Col1', 'Col2') AGAINST ('search query')  > 2 
);

那么这实际上返回了重复的结果。

【问题讨论】:

  • 查询的结构应该如何?当我更改为以下查询时,出现错误 Unknown column 'Score' in 'where Clause':SELECT MATCH('Col1', 'Col2') AGAINST('search query') AS Score, Col1, Col2, Col3 FROM my_table WHERE (Col1 = 'something-1' OR Col2 = 'something-2' OR Score > 2 ) AND Col3 = 'something3';
  • 我收回,我没有正确阅读你的陈述。如果您的语句多次返回数据,这很奇怪。如果您可以解释一下您实际上想要完成的内容,那将很有帮助,将第一条评论删除为不相关
  • 想通了这一点,由于 JOIN 使用的是唯一字段,而不是主键字段 stackoverflow.com/questions/6352454/…,导致了重复
  • 如果你不解释整个问题就很难回答:)
  • 顺便说一句,永远不要在没有括号的情况下混合 OR 和 AND,因为你无法确定代码是如何解释的,所以非常危险

标签: mysql full-text-search


【解决方案1】:

看来你只是需要

(
    Col1 = 'something-1' 
    OR 
    Col2 = 'something-2' 
    OR 
    MATCH('Col1', 'Col2') AGAINST ('search query')  > 2 
)
AND Col3 = 'something3';

【讨论】:

  • 这就是我的想法,虽然这会引发错误.... 错误代码 1064,SQL 状态 42000:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 'HAVING Score > 1); 附近使用正确的语法;
  • 当我删除围绕各种 OR 位的 ( ) 时查询有效,当我删除“得分 > 1”部分时查询也有效。虽然我需要这两个
  • 你不需要have子句,因为它被OR中已经存在的条件所取代。
  • @Arilla 你将如何过滤超过某个分数的结果?这个Score值是MySQL全文搜索正在做的计算值,这个部分是为了从搜索结果中去除低质量的结果
  • 所以将该条件排除在 OR 括号之外。您提供了一个示例,我的代码应该满足该示例。如果要过滤所有行,则可以执行( Col1 = 'something-1' OR Col2 = 'something-2' ) AND MATCH('Col1', 'Col2') AGAINST ('search query') > 2 AND Col3 = 'something3';
【解决方案2】:

@Arilia 提供的代码完美运行。主要是给我自己的提示(如果你偶然发现了类似的问题,还有其他人)在构建复杂查询时,请始终记住,在计算 MySQL 全文搜索生成的分数时,这不适用于结果中的每一行设置,有些将显示 0,因为它们不会被查询的这一部分触发,它们将被查询的其他更简单的部分触发。小学生错误。

SELECT MATCH('Col1', 'Col2') AGAINST('search query') AS Score, Col1, Col2, Col3 
FROM my_table 
WHERE 
(
    Col1 = 'something-1' 
    OR 
    Col2 = 'something-2' 
    OR 
    MATCH('Col1', 'Col2') AGAINST ('search query')  > 2 
)
AND
Col3 = 'something3';

【讨论】:

    猜你喜欢
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多