Лучший способ написать SQLite Search Query? - PullRequest
0 голосов
/ 10 января 2020

Что лучше написать SQLite для поиска данных из таблицы?

  1. Самый релевантный результат должен быть сверху
  2. Результат должен быть отсортирован по вхождению поискового термина
  3. В случае того же вхождения,
    1. Слова, начинающиеся с поисковых терминов, должны быть сверху.
    2. Слова, содержащие строку поиска в середине, должны идти позже.
    3. Если несколько слов найдено с одним и тем же шаблоном вхождения, они должны быть отсортированы в алфавитном порядке.

Например, у нас есть этот набор данных:

Borges Extra Virgin Olive Oil
Canola Oil Bottle
Extra Virgin Olive Oil - Olive Jar
Extra Virgin Olive Oil - Olive Tin
Olive Pomace Oil
Supreme Cooking Oil    

Когда поисковый термин O Выходные данные должны быть

Extra Virgin Olive Oil - Olive Jar (3 Occuracne of `O` in start)
Extra Virgin Olive Oil - Olive Tin (3 Occuracne of `O` in start)
Borges Extra Virgin Olive Oil (2 Occuracne of `O` in the start and 1 in mid)
Olive Pomace Oil (2 Occuracne of `O` in the start)
Canola Oil Bottle (1 Occuracne of `O` in the start and 2 in the mid)
Supreme Cooking Oil (1 Occuracne of `O` in the start and 2 in the mid)

Когда поисковый термин Ol Выходные данные должны быть

Extra Virgin Olive Oil - Olive Jar (2 Occuracne of `Ol` in start)
Extra Virgin Olive Oil - Olive Tin (2 Occuracne of `Ol` in start)
Borges Extra Virgin Olive Oil (1 Occuracne of `Ol` in start)
Olive Pomace Oil (1 Occuracne of `Ol` in start)
Canola Oil Bottle (1 Occuracne of `Ol` in the mind)

Когда поисковый термин Oli Выходные данные должны быть

Extra Virgin Olive Oil - Olive Jar (2 Occuracne of `Oli` in start)
Extra Virgin Olive Oil - Olive Tin (2 Occuracne of `Oli` in start)
Borges Extra Virgin Olive Oil (1 Occuracne of `Oli` in start)
Olive Pomace Oil (1 Occuracne of `Oli` in start)

1 Ответ

0 голосов
/ 10 января 2020

Сначала мы должны рассчитать вхождение строки поиска. Установите имя столбца priority. Затем мы сортируем все записи на основе этого поискового вхождения.

let searchTerm = 'Oil';
let searchQuery = `
   SELECT (length(trim(name)) - length(replace(trim(name), '${searchTerm}', ''))) as 'priority', *
   FROM product
   WHERE
       NAME LIKE '${searchTerm}' OR
       NAME LIKE '${searchTerm}%' OR
       NAME LIKE '% ${searchTerm}%' OR
       NAME LIKE '%${searchTerm}%'
   ORDER BY 1 DESC, NAME ASC
   LIMIT 0, 20
`;

Вывод будет:

Extra Virgin Olive Oil - Olive Jar (2 Occuracne of `Oli` in start)
Extra Virgin Olive Oil - Olive Tin (2 Occuracne of `Oli` in start)
Borges Extra Virgin Olive Oil (1 Occuracne of `Oli` in start)
Olive Pomace Oil (1 Occuracne of `Oli` in start)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...