Облачный Firestore Query Array из Full String - PullRequest
1 голос
/ 13 июня 2019

У меня есть коллекция в Firebase, которая содержит несколько записей, каждая из которых содержит имя и массив строк для «ключевых слов» записи. Пример ниже.

Record_1
   name: Record 1
   keywords: [apple, orange, raspberry]
Record_2
   name: Record 2
   keywords: [orange, strawberry, raspberry]
Record_3
   name: Record 3
   keywords: [apple, pear, strawberry]


//Search String: “I would like an apple and an orange.”

//Returns results: Record_1 and Record_2

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

Я бы хотел вернуть записи, в которых есть все подходящие ключевые слова из строки поиска, но не ограничения из-за слов, которых нет в строке поиска, в массивах. Пожалуйста, посмотрите пример «строка поиска» и «возвращает результаты» выше.

Есть идеи? Спасибо

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

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

collectionRef.where("keywords", "array-contains", "thing-to-look-for")

Затем вы можете объединить результаты каждого из запросов на клиенте,чтобы удалить все дубликаты.

0 голосов
/ 13 июня 2019

Это невозможно с использованием обычных запросов Cloud Firestore, если вы хотите остаться вменяемым (не хотите запускать запросы для каждой возможной комбинации).

Как вы справедливо указали, если бы вы запросили array-contains, используя каждое слово из вашей строки поиска , вы не получили бы никаких результатов, потому что ни один из документов не содержит всеслова из поисковой строки и тому подобное.

На самом деле для сложных случаев, подобных этому, от команды Cloud Firestore есть рекомендация.В документации имеется раздел «Решения» , в котором представлены решения для распространенных проблем, которые не поддерживаются архитектурой Cloud Firestore.
В этом случае вам следует рассмотреть «Поиск»решение , которое указывает на стороннее лицо под названием Algolia .

Полное раскрытие : Я не "настроил это для себя, чтобы посмотреть, сколько работы ему требуется, сколько это может стоить, и действительно ли это работает так, как я] ожидаем "(цитата Дуг Стивенсон ).Я ожидаю, что вы сами подумаете, какое решение лучше всего подойдет для вашего случая.

Сервис в основном позволяет сохранять данные на их серверах для выполнения более сложных запросов оттуда.В статье из документации объясняется, как это настроить.

Собственная альтернатива Cloud Firestore

Теоретически можно выполнять запросы для каждого отдельного слова изтвоя строкаВы должны запустить цикл, который перебирает все слова и выполняет array-contains для каждого из них.Теперь вы можете захотеть убедиться, что эта операция не чувствительна к регистру.Это потребует от вас, по крайней мере, вдвое большего количества запросов от исходного очень большого числа.Кроме того, вам придется отслеживать, какие документы совпадают, какие запросы объединять их на стороне клиента.

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