Подтвердить что ты не робот

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

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

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

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

"select name from PRODUCTS where productname LIKE '%" + keyword + "%'";

Итак, для моей ситуации, например, если пользователь вводит "чо", мне нужно привести как "шоколад", так и "хохчо". Я подумал о том, чтобы привести все данные в блок "продукты", а затем выполнить запрос на клиенте, но для большой базы данных может потребоваться много памяти. Итак, как я могу выполнить операцию sql LIKE?

Спасибо

4b9b3361

Ответ 1

Обновление: С выпуском Cloud Functions для Firebase появился еще один элегантный способ сделать это, связав Firebase с Algolia через Functions. Компромисс здесь заключается в том, что "Функции/Алголия" практически не требуют обслуживания, но, вероятно, по более высокой цене, чем "сворачивание" в Node.

В Firebase в настоящее время нет поиска контента. Многие из наиболее распространенных сценариев поиска, таких как поиск по атрибуту, будут добавлены в Firebase, поскольку API продолжает расширяться.

Между тем, безусловно, можно вырастить свой собственный. Тем не менее, поиск - это обширная тема (подумайте о создании огромного хранилища данных в реальном времени), которая сильно недооценивается и является критической характеристикой вашего приложения, а не той, которую вы хотите использовать по принципу ad hoc или даже зависите от кого-то вроде Firebase, который предоставит от вашего имени, Таким образом, обычно проще использовать масштабируемый сторонний инструмент для обработки индексации, поиска, сопоставления тегов/шаблонов, нечеткой логики, взвешенного ранжирования и т.д.

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

По сути, это делается в два этапа. Контролируйте данные и индексируйте их:

var Firebase = require('firebase');
var ElasticClient = require('elasticsearchclient')

// initialize our ElasticSearch API
var client = new ElasticClient({ host: 'localhost', port: 9200 });

// listen for changes to Firebase data
var fb = new Firebase('<INSTANCE>.firebaseio.com/widgets');
fb.on('child_added',   createOrUpdateIndex);
fb.on('child_changed', createOrUpdateIndex);
fb.on('child_removed', removeIndex);

function createOrUpdateIndex(snap) {
   client.index(this.index, this.type, snap.val(), snap.name())
     .on('data', function(data) { console.log('indexed ', snap.name()); })
     .on('error', function(err) { /* handle errors */ });
}

function removeIndex(snap) {
   client.deleteDocument(this.index, this.type, snap.name(), function(error, data) {
      if( error ) console.error('failed to delete', snap.name(), error);
      else console.log('deleted', snap.name());
   });
}

Запросите индекс, если вы хотите сделать поиск:

<script src="elastic.min.js"></script>
 <script src="elastic-jquery-client.min.js"></script>
 <script>
    ejs.client = ejs.jQueryClient('http://localhost:9200');
    client.search({
      index: 'firebase',
      type: 'widget',
      body: ejs.Request().query(ejs.MatchQuery('title', 'foo'))
    }, function (error, response) {
       // handle response
    });
 </script>

Здесь есть пример и сторонняя библиотека для упрощения интеграции.

Ответ 2

Я верю, что вы можете сделать:

admin
.database()
.ref('/vals')
.orderByChild('name')
.startAt('cho')
.endAt("cho\uf8ff")
.once('value')
.then(c => res.send(c.val()));

это найдет значения, чье имя начинается с чо.

источник

Ответ 3

Упругое поисковое решение в основном связывается с добавлением set del и предлагает получить, с помощью которого вы можете выполнить поиск текста. Затем он сохраняет содержимое в mongodb.

В то время как я люблю и reccomand эластичный поиск зрелости проекта, то же самое можно сделать без другого сервера, используя только базу данных firebase. Это я имею в виду: (https://github.com/metaschema/oxyzen)

для индексной части в основном функция:

  • JSON строит документ.
  • удаляет все имена свойств и JSON, чтобы оставить только данные (Регулярное выражение).
  • удаляет все теги xml (следовательно, также html) и атрибуты (помните старые указания, "данные не должны быть в атрибутах xml" ), чтобы оставить только чистый текст, если присутствует xml или html.
  • удаляет все специальные символы и заменяет пробел (regex)
  • заменяет все экземпляры нескольких пробелов одним пробелом (regex)
  • разбивается на пробелы и циклы:
  • для каждого слова добавляется refs к документу в некоторой структуре индекса в ваш db tha в основном содержит дочерние элементы с именами с дочерними элементами named с экранированной версией "ref/inthedatabase/dockey"
  • затем вставляет документ в качестве обычного приложения для firebase.

в реализации oxyzen, последующие обновления документа ACTUALLY читает индекс и обновляет его, удаляя слова, которые больше не соответствуют, и добавляет новые.

последующие поиски слов могут напрямую находить документы в словах child. поиск нескольких слов осуществляется с помощью хитов

Ответ 4

Возможна операция SQL "LIKE" на firebase

let node = await db.ref('yourPath').orderByChild('yourKey').startAt('!').endAt('SUBSTRING\uf8ff').once('value');