Как включить в поиск несколько слов - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь создать панель поиска, которая постоянно сужает строки в моей базе данных в зависимости от используемой строки.Я хочу, чтобы в моем поиске содержалось несколько слов, а в каждом слове - разные столбцы.

example.db

Make      Model      Year
------    ------     ------
Toyota    Corolla    2000
Toyota    Corolla    2002
Toyota    Camry      2000
Toyota    Camry      2002
Honda     Civic      2002

Это то, что у меня есть до сих пор ...

@app.route("/search")
def search():
    q = request.args.get("q") #q is a string containing make, model, and/or year 

    car = db.execute("SELECT * FROM places WHERE Make LIKE :q\
                                              OR Model LIKE :q\
                                              OR Year LIKE :q, q=q+"%")

Сейчас это работает, если я ищу только один столбец.Если у меня есть / search? Q = corolla, он выберет две строки с моделью венчика.Если у меня есть / search? Q = toyota + corolla, он не выберет ни одной строки, поскольку ни один столбец не имеет toyota corolla.

Я хочу сделать так, чтобы чем больше информации я вводил в q, тем ужерезультаты поиска будут
т.е.

  1. / search? q = toyota возвращает 4 строки
  2. / search? q = toyota + corolla возвращает 2 строки
  3. / search? q = toyota + corolla + 2000 возвращает 1 строку

Я уже некоторое время гуглю, но не могу правильно сформулировать свой вопрос.До сих пор я пытался разбить строку на пробелы и запрашивать каждое слово, но это было все равно, что искать их по отдельности.Я также попытался добавить подстановочный знак перед q, но это не решило проблему наличия нескольких слов в поиске вообще.Я полностью озадачен тем, что кажется чем-то простым.Ввод всегда будет в порядке марки, модели, года, если это имеет значение.Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 29 сентября 2018

Я бы рекомендовал использовать полнотекстовый поиск - при условии, что вы ищете полные слова.Но вы можете сделать эту работу с like.Просто сделайте сравнение другим способом:

WHERE :q LIKE '%' || Make || '%' OR
      :q LIKE '%' || Model || '%' OR
      :q LIKE '%' || Year || '%' 

Если вам нужно, чтобы все слова соответствовали, то вы можете подобраться с помощью:

WHERE ( (CASE WHEN :q LIKE '%' || Make || '%' THEN 1 ELSE 0 END) +
        (CASE WHEN :q LIKE '%' || Model || '%' THEN 1 ELSE 0 END) +
        (CASE WHEN :q LIKE '%' || Year || '%'  THEN 1 ELSE 0 END)
      ) = <# of words in :q>

Это не точно, но можетбыть достаточным для ваших целей.

0 голосов
/ 30 сентября 2018

Я полагаю, что этот случай должен возвращаться, в основном пропустите фильтр, если заданный параметр равен нулю ....

WHERE 
(Make = @Make OR CASE WHEN @Make IS NULL THEN 1 ELSE 0 END = 1)
AND
(Model = @Model OR CASE WHEN @Model IS NULL THEN 1 ELSE 0 END = 1)
AND
(Year = @Year OR CASE WHEN @Year IS NULL THEN 1 ELSE 0 END = 1)
0 голосов
/ 29 сентября 2018

Вы пытаетесь решить проблему полнотекстового поиска неправильно.Я настоятельно рекомендую вам использовать функцию полнотекстового поиска, предоставляемую базой данных, а не сравнивать со столбцами.Пожалуйста, смотрите реализацию FTS в sqlite3 здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...