Reputation: 39
I'm trying to do a "where" query in Flutter-Firebase to filter by name (if the object name is "Una casa roja" and the user writes "casa", the object must be returned). I don't know who can I do the query. I only have this, but is not what I am looking for:
.where('nombre', isGreaterThanOrEqualTo: nombre, isLessThan: nombre + 'z')
Thanks!
Upvotes: 0
Views: 13086
Reputation: 43
Unfortunately, You can't do this. Firebase documentation says that you can't do it. I don't know why firebase doesn't support that. But to do that you can use third-party APIs such as Agolia or Elastic. For more information you can get it in their documentation in this link https://firebase.google.com/docs/firestore/solutions/search
Upvotes: 3
Reputation: 143
Firestore doesn't support text-search by default. However, there are a few workarounds.
When you register a new user to your app you can store their username in firestore as an array that includes the possible ways you would search for a user (look at the attached image).
You can do that by splitting the name string.
setSearchParameters(String name) {
List<String> searchOptions = [];
String temp = "";
for (int i = 0; i < name.length; i++) {
temp = temp + name[i];
searchOptions.add(temp);
}
return searchOptions;
}
Then you can query the users collection by searching in that array using arrayContains
like this:
await usersCollection
.where('searchOptions', arrayContains: searchText)
.get()
.then((value) =>
value.docs.map((doc) => User.fromSnapShot(doc)).toList());
This solution works for simple cases but if you need advanced search capabilities then you'll have to use a 3rd party service such as Agolia.
Upvotes: 0