0

Как выполнить операцию SQL "LIKE" в Firebase?

14

Я использую Firebase для хранения данных. Структура данных выглядит следующим образом:

products: {
   product1: {
      name: "chocolate",
   },
   product2: {
      name: "chochocho",
   }
}

Мне необходимо реализовать операцию автозаполнения для этих данных. Обычно я пишу запрос следующим образом:

SELECT name FROM PRODUCTS WHERE productname LIKE '%" + keyword + "%';

Таким образом, в моем случае, если пользователь вводит "cho", мне нужно вернуть как "chocolate", так и "chochocho" в результатах. Я думал о том, чтобы вытянуть все данные из блока "products" и затем выполнить запрос на клиенте, но это может потребовать много памяти для большой базы данных. Как я могу реализовать операцию, аналогичную SQL LIKE, с использованием Firebase?

Спасибо!

2 ответ(ов)

0

Эластик-сервер в данном решении фактически связывается с операциями добавления, удаления и предлагает метод получения, который позволяет выполнять текстовые поиски. В конечном итоге содержимое сохраняется в MongoDB.

Я очень люблю и рекомендую Elasticsearch за его зрелость, но ту же функциональность можно достичь без дополнительного сервера, используя только базу данных Firebase. Вот что я имею в виду: (https://github.com/metaschema/oxyzen)

Для части индексирования используется следующая функция:

  1. Преобразует документ в JSON-строку.
  2. Удаляет все имена свойств и сами JSON-форматы, оставляя только данные (регулярное выражение).
  3. Удаляет все XML-теги (а также HTML) и атрибуты (помните старую поговорку: "данные не должны находиться в XML-атрибутах"), оставляя только чистый текст, если присутствовал XML или HTML.
  4. Удаляет все специальные символы и заменяет их на пробелы (регулярное выражение).
  5. Заменяет все вхождения нескольких пробелов на один (регулярное выражение).
  6. Разделяет по пробелам и перебирает:
  7. Для каждого слова добавляет ссылки на документ в некоторую индексную структуру в вашей базе данных, которая в основном содержит дочерние элементы, именуемые словами, и дочерние элементы, именуемые экранированной версией "ref/inthedatabase/dockey".
  8. Затем вставляет документ так же, как это сделала бы обычная приложение на Firebase.

В реализации Oxyzen последующие обновления документа ФАКТИЧЕСКИ читают индекс и обновляют его, удаляя слова, которые больше не совпадают, и добавляя новые.

Последующие поиски слов могут непосредственно находить документы в дочернем элементе слов. Поиск нескольких слов осуществляется с использованием hits.

0

В Firebase Realtime Database нет прямой поддержки операции "LIKE", как это реализовано в SQL. Однако вы можете добиться похожего эффекта, используя методы startAt() и endAt() для диапазонного поиска.

Вот пример кода, который может помочь вам выполнить подобный запрос:

let node = await db.ref('yourPath')
    .orderByChild('yourKey')
    .startAt('!') // Начинаем с символа '!'
    .endAt('SUBSTRING\uf8ff') // Завершаем до 'SUBSTRING', включая все символы после него
    .once('value');

В этом примере мы используем startAt('!') для указания начального значения и endAt('SUBSTRING\uf8ff'), чтобы захватить все ключи, начинающиеся с 'SUBSTRING'. Обратите внимание, что \uf8ff используется здесь как специальный символ для охвата всех возможных значений, следящих за 'SUBSTRING'.

Таким образом, вы сможете получить все элементы, ключи которых соответствуют требуемой подстроке. Учтите, что данный метод не так гибок, как полное использование SQL "LIKE", поэтому результат может не соответствовать всем возможным вариантам.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь