fix: Semantic Search: Use Operand Beta API (#235)
							parent
							
								
									120d104230
								
							
						
					
					
						commit
						d80f6946c8
					
				| @ -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)) | ||||
|     } | ||||
|   }), | ||||
| ) | ||||
|  | ||||
					Loading…
					
					
				
		Reference in New Issue