Точное совпадение фраз MySQL

#python #mysql #sql #python-2.7 #mysql-python

#python #mysql #sql #python-2.7 #mysql-python

Вопрос:

Я использую python и модуль mysqldb для поиска в базе данных пользовательского ввода. Я протестировал python и установил соединение с сервером и базой данных. Это SQL-код, вызывающий у меня проблемы. Мой SQl выглядит следующим образом:

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

Я использую python, поэтому {0} — это пользовательский ввод. этот бит работает. По какой-то причине точная фраза не будет соответствовать тому, что находится в столбце базы данных. Например, если пользователь вводит «Увидимся», база данных сопоставляет его как «Я хочу тебя видеть», а не просто «Увидимся». Есть ли какой-либо способ получить конкретную фразу? Я пытался использовать логический режим и регулярное выражение, но они не работают.

редактировать: Спасибо вам всем. Все ваши методы сработали, просто оказалось, что я неправильно отформатировал SQL. извините за все проблемы.

Комментарии:

1. Не могли бы вы немного прояснить вопрос? По какой фразе в вашей колонке вы хотите выполнить поиск? Вы хотите, чтобы оно совпадало, когда пользователь вводит точную фразу?

2. В настоящее время фраза «Увидимся» и да, точное совпадение

Ответ №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()
  

Комментарии:

1. Является ли MY_DB именем таблицы или базы данных?

2. Имя таблицы. Я отредактировал его. Также добавлена инициализация.

3. У меня там все правильно. Когда я запускаю его, я получаю сообщение об ошибке:

4. InputVar должен быть строкой. Как пользователь вводит символ? Похоже, что в вашем случае это кортеж, а не строка. Использовать команду ввода inputVar = raw_input("Enter phrase") ?

Ответ №3:

Взгляните на документацию MATCH … ПРОТИВ. Вам нужно простое сравнение, попробуйте что-то вроде этого:

ВЫБЕРИТЕ * ИЗ panda, ГДЕ Вопрос = {0};

Комментарии:

1. Все, что я получаю, когда пытаюсь использовать этот способ, — это нетиповые ошибки, потому что модуль не нашел значение в базе данных.

2. Вы убедились, что значение находится в базе данных? Проверьте с помощью SELECT * FROM panda или SELECT Question, Question = {0} FROM panda .

3. Да, это определенно есть в базе данных.

4. Какой тип столбцов ( VARCHAR , CHAR , TEXT , …)?

5. ДЛИННЫЙ ТЕКСТ. Должно ли это быть чем-то другим?

Ответ №4:

MATCH ... AGAINST , также известный как ПОЛНОТЕКСТОВЫЙ поиск, выполняется так, как предназначено для вас. Его цель — копаться в большом количестве текста и находить строки, содержащие текст, соответствующий вашему запросу.

Обратите внимание, что ПОЛНОТЕКСТОВЫЙ индекс видит только первые 750 или около того символов текста в столбце.

Это полезная функциональность, потому что она работает, даже если в тексте встречаются случайные знаки препинания или другие слова. WHERE column = 'value' требует точных совпадений.

Вы можете попробовать этот запрос: он представит результаты примерно в порядке возрастания длины. Это приведет к тому, что «Увидимся» будет предшествовать «Я хочу тебя видеть» в порядке результатов.

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

Обратите внимание, что выражение MATCH(Question) AGAINST('"{0}"') выдает число, указывающее близость совпадения, когда вы используете его в предложении SELECT или ORDER BY .

Обратите внимание также, что выражение CEIL(LOG2(LENGTH(Question))) в вашем ORDER BY предложении группирует ваши результаты по фрагментам на основе длины. Он группирует длины 3-4 вместе, затем длины 5-8, 9-16 и так далее.