RelevantSortConnector(
searcher: HitsSearcher,
viewModel: RelevantSortViewModel
)
Virtual indices let you use relevant sort,
a sorting mechanism that favors relevancy over the attribute you’re sorting on.
The relevantSort widget displays the current search mode when searching in a virtual replica index,
and allows users to switch between relevant and regular sorting,
which is more exhaustive but can return less relevant results.
Examples
Instantiate a RelevantSortConnector and connect it to a RelevantSortView.
Android view
class MyActivity : AppCompatActivity() {
val searcher = HitsSearcher(
applicationID = ApplicationID("YourApplicationID"),
apiKey = APIKey("YourSearchOnlyAPIKey"),
indexName = IndexName("YourIndexName")
)
val relevantSort = RelevantSortConnector(searcher)
val connection = ConnectionHandler(relevantSort)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val banner = findViewById<View>(R.id.banner)
val button = findViewById<Button>(R.id.buttonBanner)
val textView = findViewById<TextView>(R.id.labelBanner)
val view = RelevantSortBanner(banner, button, textView)
connection += relevantSort.connectView(view) { priority ->
when (priority) {
RelevantSortPriority.Relevancy -> RelevantSortText.Relevant
RelevantSortPriority.HitsCount -> RelevantSortText.All
else -> null // the index does not support Relevant sort
}
}
}
override fun onDestroy() {
super.onDestroy()
connection.disconnect()
searcher.cancel()
}
}
class RelevantSortBanner(val banner: View, val button: Button, val textView: TextView) : RelevantSortView<RelevantSortText?> {
init { button.setOnClickListener { didToggle?.invoke() } }
override var didToggle: (() -> Unit)? = null
override fun updateView(input: RelevantSortText?) {
when (input) {
null -> banner.visibility = View.GONE
else -> {
banner.visibility = View.VISIBLE
button.text = input.buttonText
textView.text = input.label
}
}
}
}
enum class RelevantSortText(val buttonText: String, val label: String) {
Relevant("Show all results", "We removed some search results to show you the most relevant ones"),
All("Show more relevant results", "Currently showing all results")
}
Compose UI
InstantSearch provides the RelevantSortState as a state model, which is an implementation of the RelevantSortView interface.
RelevantSortState must be connected to the RelevantSortConnector or RelevantSortViewModel like any other RelevantSortView implementation.
class MyActivity : AppCompatActivity() {
val searcher = HitsSearcher(
applicationID = ApplicationID("YourApplicationID"),
apiKey = APIKey("YourSearchOnlyAPIKey"),
indexName = IndexName("YourIndexName")
)
val relevantSortState = RelevantSortState<String?>(null)
val relevantSort = RelevantSortConnector(searcher)
val connections = ConnectionHandler(relevantSort)
init {
connections += relevantSort.connectView(relevantSortState) { priority ->
when (priority) {
RelevantSortPriority.Relevancy -> "We removed some search results to show you the most relevant ones"
RelevantSortPriority.HitsCount -> "Currently showing all results"
else -> null // the index does not support Relevant sort
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyRelevantSortBanner(relevantSortState) // your own UI composable to display relevant sort banner
}
}
override fun onDestroy() {
super.onDestroy()
connections.disconnect()
searcher.cancel()
}
}
Parameters
The Searcher that handles your searches.
viewModel
RelevantSortViewModel
default: RelevantSortViewModel()
The business logic handling the Relevant sort priority changes.
View
view
RelevantSortView<T>
required
The view that presents and toggles the relevant sort priority state.
If you don’t need to transform anything,
you can use RelevantSortPriorityView instead,
which is a type alias of RelevantSortView<RelevantSortPriority?>.
presenter
RelevantSortPresenter<T>
required
Presenter transforming the Relevant sort priority state to its representation for a view.
Not required if you use RelevantSortPriorityView.class RelevantSortBanner(val textView: TextView, val button: Button) : RelevantSortView<String> {
init { button.setOnClickListener { didToggle?.invoke() } }
override var didToggle: (() -> Unit)? = null
override fun updateView(input: String) { this.textView.text = input }
}
val textView = TextView(this)
val button = Button(this)
val relevantSort = RelevantSortConnector(searcher)
val view = RelevantSortBanner(textView, button)
relevantSortConnector.connectView(view) { priority ->
when (priority) {
RelevantSortPriority.Relevancy -> "Showing only relevant results."
else -> "Showing all results!"
}
}
Low-level API
If you want to fully control the RelevantSort components and connect them manually, you can use the following components:
Searcher. The Searcher that handles your searches.
RelevantSortViewModel. The business logic handling the Relevant sort priority changes.
RelevantSortView<T>. The view that presents and toggles the Relevant sort priority state. RelevantSortPriorityView is a type alias of RelevantSortView<RelevantSortPriority?>.
RelevantSortPresenter<T>. Generic presenter transforming the Relevant sort priority state to its representation for a view. Optional if you use RelevantSortPriorityView.
class MyActivity : AppCompatActivity() {
val searcher = HitsSearcher(
applicationID = ApplicationID("YourApplicationID"),
apiKey = APIKey("YourSearchOnlyAPIKey"),
indexName = IndexName("YourIndexName")
)
val connection = ConnectionHandler()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val banner = findViewById<View>(R.id.banner)
val button = findViewById<Button>(R.id.buttonBanner)
val textView = findViewById<TextView>(R.id.labelBanner)
val view = RelevantSortBanner(banner, button, textView)
val viewModel = RelevantSortViewModel()
connection += viewModel.connectSearcher(searcher)
connection += viewModel.connectView(view) { priority ->
when (priority) {
RelevantSortPriority.Relevancy -> RelevantSortText.Relevant
RelevantSortPriority.HitsCount -> RelevantSortText.All
else -> null
}
}
}
override fun onDestroy() {
super.onDestroy()
connection.disconnect()
searcher.cancel()
}
}
class RelevantSortBanner(val banner: View, val button: Button, val textView: TextView) : RelevantSortView<RelevantSortText?> {
init { button.setOnClickListener { didToggle?.invoke() } }
override var didToggle: (() -> Unit)? = null
override fun updateView(input: RelevantSortText?) {
when (input) {
null -> banner.visibility = View.GONE
else -> {
banner.visibility = View.VISIBLE
button.text = input.buttonText
textView.text = input.label
}
}
}
}
enum class RelevantSortText(val buttonText: String, val label: String) {
Relevant("Show all results", "We removed some search results to show you the most relevant ones"),
All("Show more relevant results", "Currently showing all results")
}