【问题标题】:MySQL search with word distance across neighboring recordsMySQL搜索与相邻记录之间的单词距离
【发布时间】:2015-12-11 07:12:30
【问题描述】:

我正在对 MySQL 数据库中的静态记录执行关键字文本搜索。是否可以构造一个查询来查找记录中的第一个关键字和相邻记录中的第二个关键字?考虑以下示例数据。

------------------------------------------------------
| id | textstrings                                   |
------------------------------------------------------
|  1 | Every good boy does fine.                     |
|  2 | The quick brown fox jumped over the lazy dog. |
|  3 | I will not eat green eggs and ham.            |
|  4 | There is no time like the present.            |
|  5 | Envy is an ugly shade of green.               |
------------------------------------------------------

搜索词条 green brown 应返回记录 2 和 3,因为它们是相邻记录,但不应包含记录 5,因为它不是与记录 3 相邻的。

我知道我可以对任一单词执行查询并通过处理结果集来完成此操作,但我想知道是否可以将其构建到查询中。

这个字段确实有一个 FULLTEXT 索引。

【问题讨论】:

    标签: php mysql distance levenshtein-distance


    【解决方案1】:

    您可以将两个查询连接在一起,一个将搜索包含第一个搜索字符串的 id(在此示例中为green),另一个将搜索包含第二个搜索字符串的 id(此处为brown)。

    SELECT 语句的结构方式是删除重复的相邻id 对,这可能是WHERE 子句的结果。

    SELECT LEAST(t1.id, t2.id) AS id1, GREATEST(t1.id, t2.id) AS id2
    FROM
    (
        SELECT id
        FROM table
        WHERE textstrings LIKE '%green%'
    ) t1
    INNER JOIN
    (
        SELECT id
        FROM table
        WHERE textstrings LIKE '%brown%'
    ) t2
    ON t1.id = t2.id - 1 OR t1.id = t2.id + 1
    GROUP BY LEAST(t1.id, t2.id), GREATEST(t1.id, t2.id)
    

    单击下面的链接查看正在运行的演示。

    SQLFiddle

    【讨论】:

    • 那很优雅!可以加距离吗?如,相隔 2 条记录。我不需要它,现在我只是好奇。
    • 如果您希望记录 2 条分开(并且只分开 2 条),您可以将 WHERE 子句更改为:t1.id = t2.id - 2 OR t1.id = t2.id + 2
    • 我想我现在已经想好了。非常好。感谢您的帮助!
    • 对于其他感兴趣的人,您可以通过调整比较来限制一定的距离。对于相隔不超过 3 个(含)的记录,您可以使用 ON t1.id >= t2.id - 3 AND t1.id <= t2.id + 3。根据需要调整记录间距离的数字3
    猜你喜欢
    • 2011-09-30
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多