【问题标题】:MySQL Exact phrase matchMySQL 精确词组匹配
【发布时间】:2023-04-09 01:53:01
【问题描述】:

我正在使用 python 和 mysqldb 模块在数据库中搜索用户输入。 我已经测试了 python 并建立了与服务器和数据库的连接。这是给我带来麻烦的SQL代码。 我的 SQl 如下:

SELECT * FROM panda WHERE MATCH(Question) AGAINST('"{0}"')

我使用的是 python,所以 {0} 是用户输入。那一点有效。由于某种原因,它不会将确切的短语与数据库列中的内容匹配。例如,如果用户输入“See you”,数据库会将其匹配为“I want to see you”,而不仅仅是“See you”。有什么办法可以得到特定的短语吗?我尝试过使用布尔模式和正则表达式,但它们不起作用。

编辑:谢谢大家。你所有的方法都有效,结果我没有正确格式化 SQL。抱歉给您添麻烦了。

【问题讨论】:

  • 你能把问题说得清楚一点吗?您要搜索的列中的短语是什么?当用户键入确切的短语时,您希望它匹配吗?
  • 目前的短语是“再见”,是的,完全匹配

标签: python mysql sql python-2.7 mysql-python


【解决方案1】:

那为什么不直接使用 WHERE Question = '"{0}"'

【讨论】:

    【解决方案2】:

    这是如何结合使用python和sql来搜索某个列'Question'的值等于inputVar并获取整个行中的条目。

    import MySQLdb
    db = MySQLdb.connect("localhost", "root", "password", "MY_DATABASE")
    cursor=db.cursor()
    
    sql="SELECT * FROM MY_TABLE WHERE Question = '%s';" %inputVar; 
        try:      
            cursor.execute(sql)
            row = cursor.fetchall()
            print row[0] #assuming 1st column is 'Question' column.
            db.commit()
        except:
            print ("ROLLBACK!!!")
            db.rollback()
    

    【讨论】:

    • MY_DB是表名还是数据库名?
    • 表名。我已经编辑过了。还添加了初始化。
    • 我的一切都是正确的。当我运行它时,我得到一个错误:
    • inputVar 必须是字符串。用户如何输入字符?在您的情况下,它似乎是一个元组而不是一个字符串。使用输入命令inputVar = raw_input("Enter phrase")?
    【解决方案3】:

    查看MATCH ... AGAINST 的文档。你想要的是一个简单的比较,试试这样:

    SELECT * FROM panda WHERE Question = {0};

    【讨论】:

    • 当我尝试以这种方式尝试时,我得到的只是 NoneType 错误,因为模块没有在数据库中找到该值。
    • 您确定该值在数据库中吗?请与SELECT * FROM pandaSELECT Question, Question = {0} FROM panda 联系。
    • 是的,肯定在数据库里。
    • 什么是列类型(VARCHARCHARTEXT、...)?
    • 长文本。应该是别的吗?
    【解决方案4】:

    MATCH ... AGAINST,也称为 FULLTEXT 搜索,正在按照为您设计的方式执行。其目的是挖掘大量文本并找到包含与您的查询匹配的文本的行。

    请注意,FULLTEXT 索引只能查看列中文本的前 750 个左右字符。

    这是很有用的功能,因为即使文本中出现随机标点符号或其他单词,它也能正常工作。 WHERE column = 'value' 要求完全匹配。

    您可以试试这个查询:它将大致按长度递增的顺序显示结果。这将按结果的顺序将“See you”推到“I want to see you”之前。

    SELECT * 
      FROM panda
     WHERE MATCH(Question) AGAINST('"{0}"')
     ORDER BY CEIL(LOG2(LENGTH(Question))) ASC,
           MATCH(Question) AGAINST('"{0}"')
    

    请注意,当您在SELECTORDER BY 子句中使用表达式MATCH(Question) AGAINST('"{0}"') 时,它会生成一个指定匹配紧密度的数字。

    另请注意,ORDER BY 子句中的表达式 CEIL(LOG2(LENGTH(Question))) 根据长度按块对结果进行分组。它将 3-4 的长度组合在一起,然后将 5-8、9-16 等长度组合在一起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      相关资源
      最近更新 更多