Skip to content

Commit

Permalink
Connect FirstMatchHighlighter through to searchBar
Browse files Browse the repository at this point in the history
Co-authored-by: Sam Pillsworth <[email protected]>
  • Loading branch information
valencik and samspills committed Nov 28, 2024
1 parent 010d906 commit 12a2f95
Show file tree
Hide file tree
Showing 6 changed files with 15 additions and 8 deletions.
1 change: 1 addition & 0 deletions core/src/main/scala/pink/cozydev/protosearch/Hit.scala
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,5 @@ case class Hit(
val id: Int,
val score: Double,
val fields: Map[String, String],
val highlight: String,
)
13 changes: 9 additions & 4 deletions core/src/main/scala/pink/cozydev/protosearch/MultiIndex.scala
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package pink.cozydev.protosearch

import pink.cozydev.lucille.Query
import pink.cozydev.protosearch.highlight.{FirstMatchHighlighter, FragmentFormatter}

case class MultiIndex(
indexes: Map[String, Index],
Expand All @@ -26,18 +27,22 @@ case class MultiIndex(

private val indexSearcher = IndexSearcher(this, schema.defaultOR)
private val scorer = Scorer(this, schema.defaultOR)
private val highlighter = FirstMatchHighlighter(FragmentFormatter(100, "<b>", "</b>"))
val queryAnalyzer = schema.queryAnalyzer(schema.defaultField)

/** Search the index with a `Query`. Results are sorted by descending score.
*
* @param q The `Query` to search
* @return A list of `Hit`s or error
*/
def search(q: Query): Either[String, List[Hit]] = {
def search(rawQStr: String, q: Query): Either[String, List[Hit]] = {
val docs = indexSearcher.search(q).flatMap(ds => scorer.score(q, ds))
val lstb = List.newBuilder[Hit]
docs.map(_.foreach { case (docId, score) =>
lstb += Hit(docId, score, fields.map { case (k, v) => (k, v(docId)) })
val docFields = fields.map { case (k, v) => (k, v(docId)) }
val highlight =
docFields.get("body").map(b => highlighter.highlight(b, rawQStr)).getOrElse("")
lstb += Hit(docId, score, docFields, highlight)
})
docs.map(_ => lstb.result())
}
Expand All @@ -48,7 +53,7 @@ case class MultiIndex(
* @return A list of `Hit`s or error
*/
def search(q: String): Either[String, List[Hit]] =
queryAnalyzer.parse(q).flatMap(search)
queryAnalyzer.parse(q).flatMap(pq => search(q, pq))

/** Search the index with a possibly incomplete query. Meant for use in a "search as your type"
* scenario. The last term, which is possibly incomplete, is rewritten to be a prefix.
Expand All @@ -59,7 +64,7 @@ case class MultiIndex(
def searchInteractive(partialQuery: String): Either[String, List[Hit]] = {
val rewriteQ =
queryAnalyzer.parse(partialQuery).map(mq => mq.mapLastTerm(LastTermRewrite.termToPrefix))
rewriteQ.flatMap(search)
rewriteQ.flatMap(newq => search(partialQuery, newq))
}
}
object MultiIndex {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
package pink.cozydev.protosearch.highlight

class FirstMatchHighlighterSuite extends munit.FunSuite {
val formatter = FragmentFormatter(36, "<b>", "</b>")
val formatter = FragmentFormatter(60, "<b>", "</b>")
val highlighter = FirstMatchHighlighter(formatter)

test("no highlight on no match") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ class JsHit(
val id: Int,
val score: Double,
val fields: js.Dictionary[String],
val highlight: String,
) extends js.Object

@JSExportTopLevel("Querier")
Expand All @@ -40,7 +41,7 @@ class Querier(val mIndex: MultiIndex) {
err => { println(err); Nil },
identity,
)
.map(h => new JsHit(h.id, h.score, h.fields.toJSDictionary))
.map(h => new JsHit(h.id, h.score, h.fields.toJSDictionary, h.highlight))
hits.toJSArray
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ function renderDoc(hit) {
const path = hit.fields.path
const link = "../" + hit.fields.path.replace(".txt", ".html")
const title = hit.fields.title
const preview = hit.fields.body.slice(0, 150) + "..."
const preview = hit.highlight
return (
`
<ol>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ function render(hit) {
const htmlPath = hit.fields.path.replace(".txt", ".html")
const link = new URL("../" + htmlPath, baseUrl)
const title = hit.fields.title
const preview = hit.fields.body.slice(0, 150) + "..."
const preview = hit.highlight
return (
`
<ol>
Expand Down

0 comments on commit 12a2f95

Please sign in to comment.