微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

algolia 过滤器在控制台中工作,但在实际搜索结果中不起作用

如何解决algolia 过滤器在控制台中工作,但在实际搜索结果中不起作用

所以我的目标是不仅在控制台中,而且在实际显示的结果中过滤掉 Algolia 命中。所以我已经被这个问题困住了一个月左右。我正在将 AlgoliaSearchClient API 与 Swift 和 InstantSearch 库一起使用。我最近想出了如何过滤匹配项,但它们只反映在控制台中。

这是我用来执行此操作的函数

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)")
                        }
                    }
                }
            }
        }
    }
}

}

这在控制台中完美运行,我只能看到来自当前用户 schoolID 的事件。现在,当我搜索时,在实际的搜索栏中,我可以看到来自每个用户的事件。一位 Algolia 团队成员告诉我,使用下面的这行代码也可以在实际搜索中应用过滤器。

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

我通过打印仔细检查了 id 值,它与上面函数中的值完全相同。我不明白为什么 searchBar 没有过滤掉屏幕上的点击,但它在控制台中做到了。 Algolia 团队成员说我不需要再次设置设置,因为它已经在另一个函数中设置了。

这是我用来配置 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
}

有什么建议吗?

解决方法

终于经过一个月的挣扎,我想出了一个我早就应该想出的解决方案。我决定为每个用户创建一个索引。这基本上让我不需要过滤掉记录。

我需要做的就是在 SearchController 所在的 viewController 中声明几个变量。

 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) )

与此功能一起:

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")
                }
            }
        }
    }
    
    
}

}

当然还有配置实际的searchBar本身:

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
    
}

现在有了这些功能,当我添加、删除或更新记录时,它们都对当前用户的索引唯一地起作用。 Algolia 的文档一开始非常混乱,在论坛上提问就像在跟石头说话一样。无论如何,我希望这可以在未来帮助某人。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?