fix: Semantic Search: Use Operand Beta API (#235)

This commit is contained in:
Morgan Gallant 2022-11-22 01:54:45 +09:00 committed by GitHub
parent 120d104230
commit d80f6946c8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 41 additions and 33 deletions

View File

@ -1,46 +1,54 @@
import { // Note: Currently, we use the REST API for Operand because of some unpkg/webpack issues.
operandClient, // In the future, we'd like to use the SDK (https://github.com/operandinc/typescript-sdk).
indexIDHeaderKey, // If someone knows how to do this w/o breaking the Operand typescript-sdk for npm users,
} from "https://unpkg.com/@operandinc/sdk@4.1.3/dist/esm/index.js" // please let Morgan (@morgallant) and/or (@_jzhao) know! <3
const apiKey = "{{$.Site.Data.config.search.operandApiKey}}" const apiKey = "{{$.Site.Data.config.search.operandApiKey}}"
const indexId = "{{$.Site.Data.config.search.operandIndexId}}" const indexId = "{{$.Site.Data.config.search.operandIndexId}}"
const operand = operandClient(
ObjectService, function parseSearchResults(searchResults) {
apiKey, return searchResults.matches.map((m) => ({
"https://api.operand.ai", content: m.content,
{ title: searchResults.objects[m.objectId].properties.properties._title.text,
[indexIDHeaderKey]: indexId, url: searchResults.objects[m.objectId].properties.properties._url.text,
} }))
); }
async function searchContents(query) { async function searchContents(query) {
const results = await operand.searchWithin({ const result = await fetch("https://api.operand.ai/operand.v1.ObjectService/SearchWithin", {
query, method: "POST",
limit: 10, headers: {
"Content-Type": "application/json",
Authorization: `${apiKey}`,
"Operand-Index-ID": `${indexId}`,
},
body: JSON.stringify({
query: query,
limit: 8,
}),
}) })
console.log(results.matches) if (result.ok) {
return results.matches.flat() return parseSearchResults(await result.json())
} else {
console.error(result)
}
} }
function debounce(func, timeout = 200) { function debounce(func, timeout = 200) {
let timer; let timer
return (...args) => { return (...args) => {
clearTimeout(timer) clearTimeout(timer)
timer = setTimeout(() => { func.apply(this, args); }, timeout) timer = setTimeout(() => {
}; func.apply(this, args)
}, timeout)
}
} }
registerHandlers(debounce((e) => { registerHandlers(
term = e.target.value debounce((e) => {
if (term !== "") { let term = e.target.value
searchContents(term) if (term !== "") {
.then((res) => res.results.map(entry => ({ searchContents(term).then((results) => displayResults(results))
url: entry.object.properties.url, }
content: entry.snippet, }),
title: entry.object.metadata.title )
})
))
.then(results => displayResults(results))
}
}))