Mon objectif est donc de pouvoir filtrer les hits d'Algolia non seulement dans la console, mais également dans les résultats réellement affichés. Je suis donc coincé avec ce problème depuis environ un mois maintenant. J'utilise également l'API AlgoliaSearchClient avec Swift et la bibliothèque InstantSearch. J'ai récemment découvert comment filtrer les hits, mais ils ne sont reflétés que dans la console.

Voici la fonction que j'utilise pour cela:

extension SchoolTableViewController: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
    let settings = Settings()

        .set(\.searchableAttributes, to: [.default("eventName")])
        .set(\.attributesForFaceting, to: [.filterOnly("schoolID")])
        .set(\.attributesToRetrieve, to: ["*"])

     searchResultsIndex.setSettings(settings) { (result) in
        if case .success( _) = result {
            self.getTheSchoolsID { (schoolID) in
                if let id = schoolID {
                    let query = Query().set(\.filters, to: "schoolID:\(id)")
                    
                    searchResultsIndex.search(query: query) { (result) in
                            if case .success(let response) = result {
                                print("\(response.hits)")
                        }
                    }
                }
            }
        }
    }
}

}

Cela fonctionne parfaitement dans la console, je ne peux voir que les événements des utilisateurs actuels schoolID. Maintenant, lorsque je recherche, dans la barre de recherche réelle, je peux voir les événements de chaque utilisateur. Un membre de l'équipe d'Algolia m'a dit d'utiliser cette ligne de code ci-dessous pour que le filtre soit également appliqué dans la recherche réelle.

 getTheSchoolsID { (id) in
        if let id = id {
            self.searcher.indexQueryState.query.filters = "schoolID:\(id)"
            self.searcher.search()
        }
    }

J'ai vérifié la valeur id en l'imprimant, c'est exactement la même valeur que celle de la fonction ci-dessus. Je ne peux pas comprendre pourquoi la barre de recherche ne filtre pas les résultats à l'écran, mais elle le fait dans la console. Le membre de l'équipe Algolia a dit que je n'avais pas besoin de définir à nouveau les paramètres car ils étaient déjà définis dans l'autre fonction.

Voici toute la fonction que j'utilise pour configurer la recherche Algolia:

func configureAlgoliaSearch() {
    
    getTheSchoolsID { (id) in
        if let id = id {
            self.searcher.indexQueryState.query.filters = "schoolID:\(id)"
            self.searcher.search()
        }
    }
    searchConnector.connect()
 
    navigationController?.navigationBar.prefersLargeTitles = false
    navigationItem.setHidesBackButton(true, animated: true)
    
    algoliaSearchController.searchResultsUpdater = self
    algoliaSearchController.searchBar.searchTextField.backgroundColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
    algoliaSearchController.obscuresBackgroundDuringPresentation = false
    algoliaSearchController.searchBar.placeholder = "Event Name"
    navigationItem.searchController = algoliaSearchController
    definesPresentationContext = true
}

Aucune suggestion?

0
dsonawave 9 mars 2021 à 20:34

1 réponse

Meilleure réponse

Finalement, après un mois de difficultés, j'ai trouvé une solution que j'aurais dû trouver il y a longtemps. J'ai décidé de créer un index pour chaque utilisateur. Cela me permet essentiellement de ne plus avoir à filtrer les enregistrements.

Tout ce que j'avais à faire était de déclarer quelques variables dans le viewController où se trouve le SearchController.

 public let client = SearchClient(appID: ApplicationID(rawValue: Keys.algoliaAppID), apiKey: APIKey(rawValue: Keys.algoliaApiKey))

 lazy var algoliaSearchController: UISearchController = .init(searchResultsController: hitsViewController)
lazy var searchConnector: SingleIndexSearchConnector<NameOfEvent> = .init(searcher: searcher,searchController: algoliaSearchController, hitsController: hitsViewController)

let hitsViewController: SchoolInstantiatedHitsTableViewController = .init()

let searcher: SingleIndexSearcher = SingleIndexSearcher(appID: ApplicationID(rawValue: Keys.algoliaAppID), apiKey: APIKey(rawValue: Keys.searcherApiKey), indexName: IndexName(rawValue: Auth.auth().currentUser!.uid) )

Parallèlement à cette fonction:

extension SchoolTableViewController: UISearchResultsUpdating {
func updateSearchResults(for searchController: UISearchController) {
    
    let searchBar = searchController.searchBar.searchTextField.text
    let index2 = client.index(withName: IndexName(rawValue: Auth.auth().currentUser!.uid))
    let settings = Settings()
        
        .set(\.searchableAttributes, to: [.default("eventName")])
        .set(\.attributesToRetrieve, to: ["*"])
    
    index2.setSettings(settings) { (result) in
        if case .success(_) = result {
            let query = Query(searchBar)
            
            index2.search(query: query) { (result) in
                if case .success(_ ) = result {
                    print("Success")
                }
            }
        }
    }
    
    
}

}

Et bien sûr, configurer le searchBar lui-même:

func configureAlgoliaSearch() {

    searchConnector.connect()
    searcher.search()
    algoliaSearchController.delegate = self
    algoliaSearchController.searchResultsUpdater = self
    algoliaSearchController.searchBar.searchTextField.backgroundColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)
    algoliaSearchController.obscuresBackgroundDuringPresentation = false
    algoliaSearchController.searchBar.placeholder = "Event Name"
    navigationItem.searchController = algoliaSearchController
    definesPresentationContext = true
    
}

Désormais, avec ces fonctions, lorsque j'ajoute, supprime ou met à jour des enregistrements, elles fonctionnent toutes de manière unique sur l'index de l'utilisateur actuel. La documentation d'Algolia était très déroutante au début et poser des questions sur le forum, c'est un peu comme parler à un rocher. Quoi qu'il en soit, j'espère que cela pourra aider quelqu'un à l'avenir.

0
dsonawave 10 mars 2021 à 17:13