Я знаю, что Firestore не поддерживает полнотекстовый поиск, и это дает нам решение использовать сторонние сервисы. Однако я нашел простое решение для простого «полнотекстового поиска», и я думаю, что это может помочь другим, кто не хочет использовать сторонние сервисы, как я, для такой простой задачи.
Я пытаюсь найти название компании, которое сохраняется в коллекции Firestore под моим companyName, которое может быть в любом формате, например, «Моя удивительная компания». При добавлении новой компании с companyName или обновлении значения в companyName я также сохраняю searchName вместе с ним, значение которого совпадает с названием компании, но в нижнем регистре без пробелов
searchName: removeSpace(companyName).toLowerCase()
removeSpace - моя простая пользовательская функция, которая удаляет все пробелы из текста
export const removeSpace = (string) => {
return string.replace(/\s/g, '');
}
Это превращает название нашей компании в myawesomecompany , которое сохраняется в searchName
Теперь у меня есть функция пожарного депо для поиска компании, которая индексирует с помощью searchName и возвращает companyName. Минимальное поисковое значение - это искомое значение без последнего символа, а максимальное поисковое значение - искомое значение с добавленным «zzzzzzzzzzzzzzzzzzzzzzzz», преобразованным в нижний регистр. Это означает, что если вы ищете My Aw , то минимальное значение будет mya , а максимальное значение будет myawzzzzzzzzzzzzzzzzzzzzzzz
exports.handler = ((data) => {
const searchValue = data.value.replace(/\s/g, '').toLowerCase()
const minName = searchValue.substr(0, searchName.length-1)
const maxName = searchValue + "zzzzzzzzzzzzzzzzzzzzzzzz"
let list = []
const newRef = db.collection("user").where("profile.searchName", ">=", minName).where("profile.searchName", "<=", maxName)
return newRef.get()
.then(querySnapshot => {
querySnapshot.forEach(doc => {
list.push({ name: doc.data().profile.companyName})
})
return list
})
})
У меня не было времени полностью протестировать его, но пока он работает без проблем. Пожалуйста, дайте мне знать, если вы заметили что-то не так с этим. Теперь вопрос
Является ли символ "z" символом наибольшего значения в пожарном депо, или есть какой-либо другой более достойный способ добавить в максимальное значение поиска значение без добавления "zzzzzzzzzzzzz"?