mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-06-22 10:28:27 +00:00
Add a route that only searches the full-text index
It returns the results in the same order as received from the index to preserve the relevance ordering.
This commit is contained in:
@ -9,6 +9,7 @@ import docspell.backend.JobFactory
|
||||
import docspell.store.Store
|
||||
import docspell.store.records.RJob
|
||||
import docspell.store.queue.JobQueue
|
||||
import docspell.store.queries.QItem
|
||||
import OItemSearch.{Batch, ListItem, ListItemWithTags, Query}
|
||||
|
||||
trait OFulltext[F[_]] {
|
||||
@ -26,6 +27,12 @@ trait OFulltext[F[_]] {
|
||||
batch: Batch
|
||||
): F[Vector[OFulltext.FtsItemWithTags]]
|
||||
|
||||
def findIndexOnly(
|
||||
fts: OFulltext.FtsInput,
|
||||
collective: Ident,
|
||||
batch: Batch
|
||||
): F[Vector[OFulltext.FtsItemWithTags]]
|
||||
|
||||
/** Clears the full-text index completely and launches a task that
|
||||
* indexes all data.
|
||||
*/
|
||||
@ -84,6 +91,41 @@ object OFulltext {
|
||||
else queue.insertIfNew(job) *> joex.notifyAllNodes
|
||||
} yield ()
|
||||
|
||||
def findIndexOnly(
|
||||
ftsQ: OFulltext.FtsInput,
|
||||
collective: Ident,
|
||||
batch: Batch
|
||||
): F[Vector[OFulltext.FtsItemWithTags]] = {
|
||||
val fq = FtsQuery(
|
||||
ftsQ.query,
|
||||
collective,
|
||||
Set.empty,
|
||||
batch.limit,
|
||||
batch.offset,
|
||||
FtsQuery.HighlightSetting(ftsQ.highlightPre, ftsQ.highlightPost)
|
||||
)
|
||||
for {
|
||||
ftsR <- fts.search(fq)
|
||||
ftsItems = ftsR.results.groupBy(_.itemId)
|
||||
select = ftsR.results.map(r => QItem.SelectedItem(r.itemId, r.score)).toSet
|
||||
itemsWithTags <-
|
||||
store
|
||||
.transact(
|
||||
QItem.findItemsWithTags(
|
||||
collective,
|
||||
QItem.findSelectedItems(QItem.Query.empty(collective), select)
|
||||
)
|
||||
)
|
||||
.take(batch.limit.toLong)
|
||||
.compile
|
||||
.toVector
|
||||
res =
|
||||
itemsWithTags
|
||||
.collect(convertFtsData(ftsR, ftsItems))
|
||||
.map({ case (li, fd) => FtsItemWithTags(li, fd) })
|
||||
} yield res
|
||||
}
|
||||
|
||||
def findItems(q: Query, ftsQ: FtsInput, batch: Batch): F[Vector[FtsItem]] =
|
||||
findItemsFts(q, ftsQ, batch.first, itemSearch.findItems, convertFtsData[ListItem])
|
||||
.drop(batch.offset.toLong)
|
||||
|
Reference in New Issue
Block a user