SQLite: более эффективный запрос для поиска нескольких терминов в нескольких полях - PullRequest
0 голосов
/ 09 июня 2018

Я работаю с базой данных SQLite 3, которая имеет дело с достаточно общим поиском по ключевым словам, который ищет заданные термины в нескольких (точное число в настоящее время неизвестно, но вероятно 2-5) полях.

В качестве примера предположим, что у нас есть таблица со столбцами Title и Content, и кто-то передает строку поиска 'foo bar baz', которая затем легко разделяется на три условия поиска foo,bar и baz до начала поиска.

Все это кажется достаточно простым, пока не наступит время для генерации запроса.Относительно просто с несколькими циклами for создать оператор вроде:

SELECT *
FROM table
WHERE (Title LIKE '%foo%' OR Content LIKE '%foo%') AND
      (Title LIKE '%bar%' OR Content LIKE '%bar%') AND
      (Title LIKE '%baz%' OR Content LIKE '%baz%')

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

Так что мой вопрос: существует ли более простой способ структурирования такого утверждения?

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Чтобы избежать написания длинного запроса, вы также можете передать параметры поиска во временную таблицу и использовать ее в другом:

CREATE TEMPORARY TABLE search_terms(keyword text);
INSERT INTO search_terms VALUES ('foo');
INSERT INTO search_terms VALUES ('bar');
INSERT INTO search_terms VALUES ('baz');

SELECT DISTINCT T.title,T.content FROM table T INNER JOIN search_terms ST ON
T.title LIKE '%' || ST.keyword || '%' 
OR T.content LIKE '%' || ST.keyword || '%';
0 голосов
/ 09 июня 2018

Во-первых, вы можете немного упростить запрос, используя конкатенацию строк:

WHERE (Title || ' ' || Content) LIKE '%foo%' AND
      (Title || ' ' || Content) LIKE '%bar%' AND
      (Title || ' ' || Content) LIKE '%baz%' 

Производительность, скорее всего, будет несколько хуже из-за более длинных строк и дополнительной операции над строками.Но выражение проще, и производительность все равно будет паршивой.

Почему?Потому что вы пытаетесь реплицировать полнотекстовый поиск с примитивами SQL.SQLite имеет расширения для полнотекстового поиска (см. здесь );это, вероятно, лучший способ выполнить то, что вы хотите.

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