From 101c40e464582f315d39a2af0d2cc67778a880e8 Mon Sep 17 00:00:00 2001 From: m5r Date: Mon, 14 Oct 2024 19:10:16 +0200 Subject: [PATCH] nouveau-backed fulltext search index --- ddocs/medic-db/medic-nouveau/_id | 1 + .../nouveau/contacts_by_freetext/index.js | 47 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 ddocs/medic-db/medic-nouveau/_id create mode 100644 ddocs/medic-db/medic-nouveau/nouveau/contacts_by_freetext/index.js diff --git a/ddocs/medic-db/medic-nouveau/_id b/ddocs/medic-db/medic-nouveau/_id new file mode 100644 index 0000000000..3585031d0e --- /dev/null +++ b/ddocs/medic-db/medic-nouveau/_id @@ -0,0 +1 @@ +_design/medic-nouveau diff --git a/ddocs/medic-db/medic-nouveau/nouveau/contacts_by_freetext/index.js b/ddocs/medic-db/medic-nouveau/nouveau/contacts_by_freetext/index.js new file mode 100644 index 0000000000..907aec546c --- /dev/null +++ b/ddocs/medic-db/medic-nouveau/nouveau/contacts_by_freetext/index.js @@ -0,0 +1,47 @@ +function(doc) { + const skip = [ '_id', '_rev', 'type', 'refid', 'geolocation' ]; + let toIndex = ''; + + const types = [ 'district_hospital', 'health_center', 'clinic', 'person' ]; + let idx; + if (doc.type === 'contact') { + idx = types.indexOf(doc.contact_type); + if (idx === -1) { + idx = doc.contact_type; + } + } else { + idx = types.indexOf(doc.type); + } + + const isContactDoc = idx !== -1; + if (isContactDoc) { + Object.keys(doc).forEach(function(key) { + const value = doc[key]; + if (!key || !value) { + return; + } + + key = key.toLowerCase(); + if (skip.indexOf(key) !== -1 || /_date$/.test(key)) { + return; + } + + if (typeof value === 'string') { + toIndex += ' ' + value; + } + + /*if (typeof value === 'number') { + index('double', key, value, { store: true }); + }*/ + + /*if (typeof value === 'string') { + index('text', key, value, { store: true }); + }*/ + }); + + toIndex = toIndex.trim(); + if (toIndex) { + index('text', 'default', toIndex, { store: true }); + } + } +}