【问题标题】:SQL Full text match value is returning only Boolean (1 or 0) for matched itemsSQL 全文匹配值仅返回匹配项的布尔值(1 或 0)
【发布时间】:2012-07-18 14:17:57
【问题描述】:

我有以下 SQL 语句:

SELECT
    g.*,
        (
            MATCH (g.GameTitle) AGAINST ('call of duty')
            OR g.GameTitle SOUNDS LIKE 'call of duty'
        )
    AS MatchValue,
    p.id AS platformid,
    p.alias AS PlatformAlias,
    p.name,
    p.icon
FROM
    games AS g,
    platforms AS p
WHERE
    (
        (
            MATCH (g.GameTitle) AGAINST ('call of duty')
            OR g.GameTitle SOUNDS LIKE 'call of duty'
        )
        OR
        (
            MATCH (g.Alternates) AGAINST ('call of duty')
            OR g.Alternates SOUNDS LIKE 'call of duty'
        )
    )

AND g.Platform = p.id
ORDER BY MatchValue DESC

在与全文索引匹配时返回一组正确的结果,但是报告的“MatchValue”仅具有布尔性质(0 或 1)。

如果我删除语句的第 5 行:

OR g.GameTitle SOUNDS LIKE 'call of duty'

我得到了不错的匹配值,范围从大约 5.23 到 15.56,但是在匹配“替代”时我失去了一些功能。

我对 SQL 并不精通,我花了好几天的时间才让它运行得这么好......

有没有办法让第 5 行和第 6 行返回一个非布尔匹配值,以便我的结果正确排序?

提前致谢;)

【问题讨论】:

  • 您希望如何确定与MATCH 返回的相关值有意义相关并且可以在其中排序的g.GameTitle SOUNDS LIKE 'call of duty'(或本质上是SOUNDEX(g.GameTitle))的相关值?跨度>
  • 看来我错误地认为 SOUNDEX 返回了一个相关值,也许我将它与其他东西混淆了......感谢您的澄清:)

标签: mysql match full-text-search


【解决方案1】:

当您说'ABC' OR (3 > 2) 时,您要求的是BOOL 结果。您不能获取字符串或布尔值。在上述情况下,字符串'abc' 转换为布尔值0,因为它不代表数字。

由于OR字符串和布尔值没有多大意义,我将两者分开:

SELECT
    g.*,
        (
            MATCH (g.GameTitle) AGAINST ('call of duty')
            OR g.GameTitle SOUNDS LIKE 'call of duty'
        )
    AS MatchResultBoolean,
    MATCH (g.GameTitle) AGAINST ('call of duty') AS MatchText,
    p.id AS platformid,
    p.alias AS PlatformAlias,
    p.name,
    p.icon
FROM
    games AS g,
    platforms AS p
WHERE
    (
        (
            MATCH (g.GameTitle) AGAINST ('call of duty')
            OR g.GameTitle SOUNDS LIKE 'call of duty'
        )
        OR
        (
            MATCH (g.Alternates) AGAINST ('call of duty')
            OR g.Alternates SOUNDS LIKE 'call of duty'
        )
    )

AND g.Platform = p.id
ORDER BY MatchValue DESC

注意变化:

        (
            MATCH (g.GameTitle) AGAINST ('call of duty')
            OR g.GameTitle SOUNDS LIKE 'call of duty'
        )
    AS MatchResultBoolean,
    MATCH (g.GameTitle) AGAINST ('call of duty') AS MatchText,

通过这种方式,您可以两种方式获得:一次获得布尔值,在另一列中获得(可能的)匹配项。

【讨论】:

  • 感谢您向我解释这一点,您的方式更有意义。我想如果我希望能够在我的应用程序中包含这两种类型的匹配项并按相关性对这个混合集进行排序,我可以从您提供的上述查询中获取结果,将它们全部粘贴到 PHP 数组(或等效数组)中,然后根据初始搜索字符串对它们进行排序......虽然我们讨论的是这个主题,但我认为您不知道可以在 php 中完成这种类型的相关性排序的库/脚本或一些资源?再次感谢您的帮助! ;)
  • Ii 可能有点过头了,但sphinxsearch 是一个非常强大的搜索引擎。不过,我认为这会使您的事情变得相当复杂。
猜你喜欢
  • 2011-12-12
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多