Поиск по шаблону в коллекции Cloud Firestore - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь выполнить фильтрацию по шаблону над коллекцией Firestore.Например, в моей базе данных Firestore есть бренд под названием adidas.У пользователя будет поисковый ввод, в котором ввод «adi», «adid», «adida» или «adidas» возвращает документ adidas.Я указал несколько решений для этого:

1. Получите все документы и выполните внешний фильтр

var brands = db.collection("brands");
filteredBrands = brands.filter((br) => br.name.includes("pattern"));

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

2. Использование Elasticsearch или Algolia

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

3. Пользовательское поле searchName при создании объекта

Итак, у меня было такое решение: при создании документа создайте поле с массивом возможных шаблонов поиска:

{
    ...
    "name":"adidas",
    "searchNames":[
        "adi",
        "adida",
        "adidas"
    ],
    ...
}

, чтобы документможно получить доступ с помощью:

filteredBrands = db.collection("brands").where("searchNames", "array-contains", "pattern");

Итак, у меня было несколько вопросов:

  • Что вы думаете о значимости и эффективности этого третьего решения?Как вы думаете, насколько это может быть лучше, чем использование стороннего решения в качестве Elasticsearch или Algolia?
  • Есть ли у вас какие-либо другие идеи по выполнению фильтрации шаблонов по коллекции в пожарном хранилище?

1 Ответ

0 голосов
/ 03 октября 2018

ИМХО, первое решение определенно , а не вариант.Загрузка всей коллекции для поиска полей на стороне клиента нецелесообразна, а также очень затратна.

Второй вариант - лучший вариант, учитывая тот факт, что он поможет вам включить полнотекстовый поиск во всемБаза данных Cloud Firestore.Вам решать, стоит ли его использовать.

Что вы думаете о целесообразности и эффективности этого 3-го решения?

Относительнотретье решение, оно может работать, но оно подразумевает, что вы создаете массив возможных поисковых паттернов, даже если название бренда очень длинное.Как я вижу в вашей схеме, вы добавляете возможные шаблоны поиска, начиная с 3-й буквы, что означает, что, если кто-то ищет ad, результат не будет найден.Недостатком этого решения является тот факт, что если у вас есть бренд с именем Asics Tiger и пользователь выполняет поиск по Tig или Tige, у вас снова не будет результатов.

Есть ли у вас какие-либо идеи по выполнению фильтра шаблонов по коллекции Firestore?

Если вы заинтересованы в получении результатов только из одного слова и использования в качестве шаблона начальных букв бренда, яРекомендую вам лучшее решение, использующее запрос, который выглядит следующим образом:

var brands = db.collection("brands");
brands.orderBy("name").startAt(searchName).endAt(searchName + "\uf8ff")

В этом случае поиск, например a или ad, будет работать отлично.Кроме того, не будет необходимости создавать какие-либо другие массивы.Таким образом, будет меньше записей в документе.

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