Привет друзья еще раз!
Мне нужно реализовать полнотекстовый поиск в моем приложении для Android, и я ищу лучший способ.
Я нашел несколько способов сделать это, но я прошу совета, какой из них будет лучшим и вызовет меньше проблем. У меня есть одна коллекция полных данных, в которой есть HTML-текст, который я анализирую после запроса и затем отображаю. Мне нужно реализовать полнотекстовый поиск в этой коллекции.
Я нашел рекомендуемый текстовый поиск по Алголии , но это не совсем то, что мне действительно нужно. Или, может быть, я мог бы искать текст из кэша, который кэширует данные, когда соединение находится в автономном режиме, по документам Firestore?
Можно ли запросить все данные и затем сохранить их в ArrayList или, возможно, в Array, или какой вариант будет наилучшим?
Вот мой viewModel, который запрашивает всю коллекцию.
public class DetailActivityViewModel extends ViewModel {
private final FirebaseListLiveData<Data> liveDataQuery;
public DetailActivityViewModel(String id) {
liveDataQuery = new FirebaseListLiveData<>(Data.class, FirebaseFirestore.getInstance()
.collection("fullData").whereEqualTo("mainId", id)
.orderBy("order", Query.Direction.ASCENDING));
}
public FirebaseListLiveData<Data> getLiveDataQuery() {
return liveDataQuery;
}
}
И, наконец, мои пользовательские LiveData.
public class FirebaseListLiveData<T> extends LiveData<List<T>> implements EventListener<QuerySnapshot> {
private Class<T> typeParameter;
private Query query;
private ListenerRegistration listenerRegistration;
public FirebaseListLiveData(Class<T> typeParameter, Query query) {
this.typeParameter = typeParameter;
this.query = query;
}
@Override
protected void onActive() {
if (listenerRegistration == null) {
listenerRegistration = query.addSnapshotListener(this);
}
}
@Override
protected void onInactive() {
if (listenerRegistration != null) {
listenerRegistration.remove();
listenerRegistration = null;
}
}
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
if (e == null) {
if (queryDocumentSnapshots != null && !queryDocumentSnapshots.isEmpty()) {
postValue(queryDocumentSnapshots.toObjects(typeParameter));
} else {
postValue(null);
}
} else {
postValue(null);
}
}
}