【问题标题】:Autocomplete SQL Query suggestions (Ajax+PHP)自动完成 SQL 查询建议 (Ajax+PHP)
【发布时间】:2013-02-27 03:20:45
【问题描述】:

我有一个关于在编写用于自动完成表单 (jquery Axax + PHP) 的查询时的 SQL 最佳实践的问题。

让我们假设以下内容:

  • 我有一个包含书名的数据库
  • 有些书的标题没有定冠词(“The”或“A”),例如“Life of Pi”
  • 有些书的标题带有定冠词(“The”或“A”),例如“The Catcher in the Rye”

因此,用户将输入书名,要么使用开头的“The”,要么直接省略“The”并开始查询而没有任何定冠词。

似乎存在三个可能的查询:

SELECT 'title' FROM 'books' WHERE 'title' LIKE '%$string'

SELECT 'title' FROM 'books' WHERE 'title' LIKE '$string%'

SELECT 'title' FROM 'books' WHERE 'title' LIKE '%$string%'

当使用第一种查询方法时(其中 % 在字符串之前),很难得到任何结果,因为字符串之前的通配符似乎表现错误。

使用第二个查询时,似乎更倾向于在标题前使用“The”进行完全匹配。因此,搜索“麦田里的守望者”的用户会找到这本书,但搜索“麦田里的守望者”的用户不会。

最后一个结果是最好的,因为它在字符串前后都有一个通配符。但是,它也给出了最长的自动完成列表。用户必须输入几个字母来缩小搜索结果的范围。

关于实现更高效的查询有什么想法吗?还是第三个选项是最好的(因为在书名中将定冠词分开是不可行的?

提前致谢,

【问题讨论】:

    标签: php jquery mysql sql ajax


    【解决方案1】:
    $query = mysqi_query("SELECT title FROM books WHERE title REGEXP '$string'");
    if($query->num_rows() == 0) {
    
         //First remove all the stop words like for, the, of, a from the search string.
         $stopWords = array('/\bfor\b/i', '/\bthe\b/i', '/\bto\b/i', '/\bof\b/i','/\ba\b/i');
         $string = preg_replace($stopWords, "", $string);
    
         //Then, use 
         mysqli_query("SELECT title FROM books WHERE title REGEXP '$string'");
    }
    

    【讨论】:

    • 这是我没有想到的,因为使用 REGEX 我会更深入地研究这个,但是,这可能会在一段时间后变得困难,毕竟有些停用词是标题的一部分。即“为了上帝和国家”
    • 例如“For God and Country”如果你不删除停用词“for”和“and”,你可能会想出 20 个结果,你可能会想出 20 个结果,但如果你删除停用词你可能只会得到 5 个结果。
    【解决方案2】:

    您可以使用正则表达式进行搜索(查询结果很快) 并且不要忘记为您的结果添加限制。

    一个小例子

    SELECT title FROM books WHERE title REGEXP '$string' LIMIT 20
    

    或者你可以使用单词边界

    SELECT title FROM books WHERE title REGEXP '[[:<:]]$string[[:>:]]' LIMIT 20
    

    查看文档http://dev.mysql.com/doc/refman/5.5/en/regexp.html

    【讨论】:

    • 谢谢,我肯定会更深入地研究 REGEX 作为一个选项,似乎与这两个通配符有相似的行为,只是它整体上可能更强大(因为它搜索模式)。
    【解决方案3】:

    您也可以考虑允许搜索仍然匹配的“Catcher Rye”。

    在这种情况下 - 您将标记标题中的每个单词以及用户输入的单词并找到最佳匹配。

    否则只有在输入 4 个或更多字符后才自动完成,并使用选项 3。

    【讨论】:

      【解决方案4】:

      我建议在字符串的任一侧使用带有通配符的第三种方法。如果您担心返回的结果集的大小,也许将结果限制在一定数量,随着用户键入,列表自然会变得更小更具体。

      【讨论】:

        【解决方案5】:

        如果您担心建议的数量,您是否可以修改更改事件以仅在他们在字段中输入了一些最少字符数后才检索建议?

        【讨论】:

        • 我想是这样,但什么是好的标准? 2个字母? 3?
        猜你喜欢
        • 1970-01-01
        • 2011-02-07
        • 2017-07-28
        • 1970-01-01
        • 2023-03-24
        • 2016-10-30
        • 2014-09-13
        • 2016-04-30
        • 2012-05-18
        相关资源
        最近更新 更多