From fec8fd9a09ea90078d5d61d298d145cdee272d10 Mon Sep 17 00:00:00 2001 From: Morgan Gallant Date: Tue, 22 Nov 2022 01:54:45 +0900 Subject: [PATCH] fix: Semantic Search: Use Operand Beta API (#235) --- assets/js/semantic-search.js | 74 ++++++++++++++++++++---------------- 1 file changed, 41 insertions(+), 33 deletions(-) diff --git a/assets/js/semantic-search.js b/assets/js/semantic-search.js index ec28d537..bfe102e0 100644 --- a/assets/js/semantic-search.js +++ b/assets/js/semantic-search.js @@ -1,46 +1,54 @@ -import { - operandClient, - indexIDHeaderKey, -} from "https://unpkg.com/@operandinc/sdk@4.1.3/dist/esm/index.js" +// Note: Currently, we use the REST API for Operand because of some unpkg/webpack issues. +// In the future, we'd like to use the SDK (https://github.com/operandinc/typescript-sdk). +// If someone knows how to do this w/o breaking the Operand typescript-sdk for npm users, +// please let Morgan (@morgallant) and/or (@_jzhao) know! <3 const apiKey = "{{$.Site.Data.config.search.operandApiKey}}" const indexId = "{{$.Site.Data.config.search.operandIndexId}}" -const operand = operandClient( - ObjectService, - apiKey, - "https://api.operand.ai", - { - [indexIDHeaderKey]: indexId, - } -); + +function parseSearchResults(searchResults) { + return searchResults.matches.map((m) => ({ + content: m.content, + title: searchResults.objects[m.objectId].properties.properties._title.text, + url: searchResults.objects[m.objectId].properties.properties._url.text, + })) +} async function searchContents(query) { - const results = await operand.searchWithin({ - query, - limit: 10, + const result = await fetch("https://api.operand.ai/operand.v1.ObjectService/SearchWithin", { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `${apiKey}`, + "Operand-Index-ID": `${indexId}`, + }, + body: JSON.stringify({ + query: query, + limit: 8, + }), }) - console.log(results.matches) - return results.matches.flat() + if (result.ok) { + return parseSearchResults(await result.json()) + } else { + console.error(result) + } } function debounce(func, timeout = 200) { - let timer; + let timer return (...args) => { clearTimeout(timer) - timer = setTimeout(() => { func.apply(this, args); }, timeout) - }; + timer = setTimeout(() => { + func.apply(this, args) + }, timeout) + } } -registerHandlers(debounce((e) => { - term = e.target.value - if (term !== "") { - searchContents(term) - .then((res) => res.results.map(entry => ({ - url: entry.object.properties.url, - content: entry.snippet, - title: entry.object.metadata.title - }) - )) - .then(results => displayResults(results)) - } -})) +registerHandlers( + debounce((e) => { + let term = e.target.value + if (term !== "") { + searchContents(term).then((results) => displayResults(results)) + } + }), +)