REST Service for POPCORN - ILIAS
alex
2025-08-01 39bb717c40c538bc16f1cef7d9737ac619a0ead4
lib/search.js
@@ -1,11 +1,16 @@
const fs = require("node:fs")
const _ = require("lodash")
const {Index, Document, Worker} = require("flexsearch")
const settings = require("../settings")
const log = require("../logger")
/////////////////////////////////////////////////////////////////////////
// Message index
const options = {
   tokenize: "full",
   // tokenize: "full",
   tokenize: "forward",
   split: true,
}
@@ -64,36 +69,54 @@
}
// run()
// .then(console.log)
// .then(log.info)
// .catch(console.error)
async function run() {
async function run () {
   await doIndex()
   console.log(search("latu"))
   log.info(search("latu"))
}
/////////////////////////////////////////////////////////////////////////
let indexed = false
async function doIndex () {
   const start = Date.now()
   console.log("++ START indexing Users...")
   let users = require("../users.json")
   // users = users.slice(10)
   log.info("++ START indexing Users...")
   const {readFromFile, file} = settings.search
   clearIndex(idxUser)
   let users
   if (readFromFile) {
      users = fs.readFileSync(file, "utf8")
      users = JSON.parse(users)
   }
   else {
      log.info("~~~ reading users from DB ... ~~~")
      const db = require("./db")
      const {data} = await db.getUsers(0, 100000)
      log.info(`loaded ${data.length} users from DB...`)
      users = data
   }
   for (const user of users) {
      addUser(user)
      // addTags(user)
   }
   console.log(`++ END indexing Users in ${Date.now() - start}ms`)
   indexed = true
   log.info(`++ END indexing Users in ${Date.now() - start}ms`)
}
function search (query) {
   return idxUser.search(query)
async function search (query) {
   // when called from a cli program the search index is not initalized
   if(!indexed) await doIndex()
   const searchLimit = 10000
   return idxUser.search(query, searchLimit)
}
function searchUsers (query, user) {
   // query = query.split(" ").join(" OR ") // ohne das "OR" scheint immer nur "AND" zu sein | die search option {bool:"or"} wird ignoriert
   // console.log(`searching messages for "${query}"`)
   // log.info(`searching messages for "${query}"`)
   return idxUser.search(`${user} ${query}`, {suggest: true})
}
@@ -108,8 +131,11 @@
/////// idxMessage FNS ////////////////////////////////////////////////////////////////
function getUserString (user) {
   const {usr_id, firstname, lastname} = user
   return `${usr_id} ${firstname} ${lastname}`.trim()
   const {usr_id, firstname, lastname, login, institution, department} = user
   // if(firstname.trim()==="Adolfo") log.info(user)
   return `${login} ${firstname} ${lastname} ${institution} ${department}`.trim()
   // return `${usr_id} ${login} ${firstname} ${lastname} ${institution} ${department}`.trim() // KEINE usr_id
   // return `${usr_id} ${firstname} ${lastname}`.trim()
}
function addUser (user) {
@@ -124,6 +150,10 @@
   remove(idxUser, usr_id)
}
function clearIndex(index) {
   index.clear()
}
/////// idxTags FNS ////////////////////////////////////////////////////////////////