我正在 Kotlin 中开发一个个人 Android 应用程序,我想实现一个 InstantSearch。我在阿尔戈利亚有以下记录结构:
{
"creationTime": 1566396861797,
"description": "It's my second home now...",
"imagePath": "https://firebasestorage.googleapis.com/.......",
"memoryId": "-LmoWe8PEqCs0Szv9KKJ",
"memoryTitle": "Second visit",
"userId": "vIWJgFpnUSeZJw3wjrJeEAxbNoE2",
"imageLabels": [
"Property",
"Furniture",
"City",
"Human settlement",
"Real estate",
"Roof",
"Room",
"Skyline",
"Building",
"Metropolitan area",
"Sky",
"Balcony",
"Apartment"
],
"objectID": "-LmoWe8PEqCs0Szv9KKJ"
}
在我的即时搜索中,我想提供一个搜索,仅显示与发送查询的特定用户具有相同值userId
记录。 首先,我将 userId 添加到仪表板中的分面属性中。 我不知道如何从这一点继续。我不知道如何在查询时过滤记录。
这是我的视图模型:
class MyViewModel : ViewModel() {
val client = ClientSearch(ApplicationID("*****"), APIKey("*******"), LogLevel.ALL)
val index = client.initIndex(IndexName("memory_diary"))
val searcher = SearcherSingleIndex(index)
val adapterMemory = MemoryAdapter()
val dataSourceFactory = SearcherSingleIndexDataSource.Factory(searcher) { hit ->
Memory(
hit.json.getPrimitive("userId").content,
hit.json.getPrimitive("objectID").content,
hit.json.getPrimitive("memoryTitle").content,
hit.json.getPrimitive("description").content,
hit.json.getPrimitive("creationTime").content.toLong(),
hit.json.getPrimitive("imagePath").content,
hit.json.getArray("imageLabels").content.map { jsnelm -> jsnelm.content }
)
}
val pagedListConfig = PagedList.Config.Builder().setPageSize(50).build()
val memories: LiveData<PagedList<Memory>> = LivePagedListBuilder(dataSourceFactory, pagedListConfig).build()
val searchBox = SearchBoxConnectorPagedList(searcher, listOf(memories))
val stats = StatsConnector(searcher)
val filterState = FilterState()
val connection = ConnectionHandler()
init {
connection += searchBox
connection += stats
connection += filterState.connectPagedList(memories)
}
override fun onCleared() {
super.onCleared()
searcher.cancel()
connection.disconnect()
}
}
我也许有一个功能可以过滤SearcherSingleIndexDataSource.Factory
中的记录,但我没有找到这样的东西。
那我该怎么做呢?
若要了解如何在查询时注入筛选器,请参阅我们的 FilterState 文档。
在你的情况下,你可以写这样的东西:
filterState.notify {
add(FilterGroupID(), Filter.Facet(Attribute("userId"), "user_id_value"))
}
让我知道这是否解决了您的问题。
我实现了过滤器,而不必等待用户输入,它就可以工作
我遵循了algolia文档,但跳过了一些部分 https://www.algolia.com/doc/guides/building-search-ui/getting-started/android/
筛选器状态需要一个属性:在您的情况下是 userId。
定义运算符和筛选器方面
搜索器将自身连接到 FilterState,并在每次搜索时应用其筛选器。
connection += searcher.connectFilterState(filterState)
在恢复中,您的视图模型如下所示:
val filterState = FilterState()
val filterGroupID = FilterGroupID("myGroup", FilterOperator.And)
val userId = Attribute("userId")
val filterUserId = Filter.Facet(userId, "your_user_id")
val connection = ConnectionHandler()
init {
filterState.add(filterGroupID, owner)
connection += searchBox
connection += searcher.connectFilterState(filterState)
connection += filterState.connectPagedList(memories)
}