{"id":16,"date":"2025-11-23T17:43:59","date_gmt":"2025-11-23T17:43:59","guid":{"rendered":"https:\/\/pilago-ai.io-dev.se\/?page_id=16"},"modified":"2026-01-15T14:17:22","modified_gmt":"2026-01-15T14:17:22","slug":"technical-foundations-behind-io-semantic-search","status":"publish","type":"page","link":"https:\/\/pilago-ai.io-dev.se\/?page_id=16","title":{"rendered":"Technical foundations"},"content":{"rendered":"<section id=\"text-block_a5238d158c092c8ddf808d2a07641ed2\" class=\"block text\">\n\t<div class=\"container container--narrow container--static\">\n\n\t\t<div class=\"text__inner editor-content\">\n\n<h2 class=\"wp-block-heading\">Technical foundations<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1536\" height=\"672\" src=\"https:\/\/pilago-ai.io-dev.se\/app\/uploads\/2026\/01\/technical_foundations_1-2.png\" alt=\"\" class=\"wp-image-102\"\/><\/figure>\n\n\n\n<p>iO Smart Search is not&nbsp;a&nbsp;single algorithm, but a&nbsp;collection&nbsp;of carefully combined&nbsp;building blocks&nbsp;that together&nbsp;create a&nbsp;modern&nbsp;search&nbsp;experience&nbsp;for&nbsp;WordPress. Each&nbsp;part is&nbsp;designed&nbsp;to&nbsp;solve&nbsp;a specific problem&nbsp;\u2013 from understanding&nbsp;meaning, to&nbsp;ranking&nbsp;trustworthy&nbsp;content, to keeping&nbsp;the&nbsp;system&nbsp;observable&nbsp;and safe&nbsp;in&nbsp;production.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Hybrid search: keywords&nbsp;+ semantic vectors<\/h3>\n\n\n\n<p>At the core of&nbsp;the&nbsp;plugin&nbsp;is a&nbsp;hybrid&nbsp;ranking model&nbsp;that blends&nbsp;classic keyword&nbsp;search with semantic&nbsp;vector search. Keywords&nbsp;are still&nbsp;great&nbsp;for exact matches and&nbsp;short,&nbsp;\u201cknown&nbsp;item\u201d queries, while&nbsp;vectors&nbsp;capture&nbsp;meaning&nbsp;even when users&nbsp;phrase things&nbsp;differently&nbsp;from the content. For&nbsp;every&nbsp;query, iO Semantic Search runs&nbsp;both layers and&nbsp;combines&nbsp;them into a&nbsp;single&nbsp;score&nbsp;using a&nbsp;tunable weight: you&nbsp;can&nbsp;decide how&nbsp;dominant&nbsp;the&nbsp;semantic part should be&nbsp;compared to&nbsp;raw keyword&nbsp;matches.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Embeddings and&nbsp;AI&nbsp;providers: OpenAI and Bonzai<\/h3>\n\n\n\n<p>To&nbsp;understand&nbsp;meaning, the plugin&nbsp;converts text into vector embeddings. These embeddings are&nbsp;generated&nbsp;through&nbsp;either OpenAI\u2019s API&nbsp;or&nbsp;iO\u2019s&nbsp;own&nbsp;Bonzai platform, which&nbsp;acts&nbsp;as a universal gateway&nbsp;to multiple&nbsp;large&nbsp;language models. The&nbsp;admin&nbsp;can&nbsp;choose which&nbsp;provider&nbsp;and&nbsp;model&nbsp;to&nbsp;use&nbsp;for embeddings&nbsp;and&nbsp;summaries and optionally enable fallback: if the primary&nbsp;provider fails, the plugin&nbsp;automatically&nbsp;tries the&nbsp;other&nbsp;one before&nbsp;falling&nbsp;back&nbsp;to&nbsp;classic&nbsp;WordPress search. This&nbsp;gives&nbsp;you&nbsp;the&nbsp;benefits&nbsp;of&nbsp;AI&nbsp;without&nbsp;tying&nbsp;the&nbsp;site&nbsp;to&nbsp;a&nbsp;single external&nbsp;service.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vector&nbsp;backends<\/h3>\n\n\n\n<p>MySQL&nbsp;and&nbsp;QdrantEmbeddings&nbsp;are stored in a&nbsp;dedicated&nbsp;vector backend. For small and medium sites, iO Smart Search uses&nbsp;a custom MySQL table in the&nbsp;same database as WordPress \u2013 easy to back up, easy to host, perfect for local MAMP setups and simple environments. For&nbsp;larger&nbsp;installations, the&nbsp;plugin&nbsp;can switch to Qdrant, a dedicated vector&nbsp;database accessed via REST. The rest of the code&nbsp;does not care which backend&nbsp;you use; the choice simply changes&nbsp;performance and scaling characteristics, not&nbsp;the public API.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Content&nbsp;authority&nbsp;and&nbsp;per\u2011post&nbsp;control<\/h3>\n\n\n\n<p>Not all content is&nbsp;equally important. To reflect that, the plugin lets you&nbsp;define authority levels (for example \u201cofficial\u201d, \u201cnormal\u201d, \u201copinion\u201d) with&nbsp;different weights. Editors assign these levels per post via a metabox, and the final ranking score is multiplied by the authority weight. This ensures that&nbsp;official pages and policy documents naturally rise above opinion pieces and blog posts, even when they talk about similar topics.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fuzzy search, synonyms and autosuggest<\/h3>\n\n\n\n<p>Real users misspell things&nbsp;and use&nbsp;their&nbsp;own terminology. iO&nbsp;Smart Search tackles this&nbsp;with&nbsp;a&nbsp;combination of fuzzy\u2011friendly&nbsp;keyword&nbsp;logic, editor\u2011defined synonyms and&nbsp;live autosuggest. Synonyms&nbsp;and&nbsp;aliases&nbsp;(such as&nbsp;SUV&nbsp;\u2192&nbsp;XC90, XC60) are&nbsp;injected into&nbsp;both keyword and&nbsp;semantic&nbsp;layers&nbsp;so&nbsp;the system&nbsp;understands&nbsp;domain&nbsp;language. Autosuggest&nbsp;is powered by a lightweight&nbsp;REST&nbsp;endpoint that&nbsp;uses the same&nbsp;hybrid&nbsp;ranking&nbsp;as&nbsp;full&nbsp;search, meaning&nbsp;that&nbsp;suggestions&nbsp;and final results stay&nbsp;in&nbsp;sync and&nbsp;still&nbsp;benefit&nbsp;from&nbsp;authority&nbsp;and&nbsp;synonyms.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Headless\u2011ready&nbsp;APIs and&nbsp;classic&nbsp;theme&nbsp;integration<\/h3>\n\n\n\n<p>All&nbsp;of&nbsp;the above&nbsp;is&nbsp;exposed&nbsp;both&nbsp;to&nbsp;classic&nbsp;WordPress themes and to&nbsp;headless frontends. The plugin&nbsp;integrates&nbsp;with&nbsp;the&nbsp;native&nbsp;search&nbsp;query&nbsp;to override results&nbsp;when&nbsp;enabled, but&nbsp;it also ships a&nbsp;dedicated REST&nbsp;API&nbsp;endpoint&nbsp;that&nbsp;returns ranked results as&nbsp;JSON. This allows&nbsp;the&nbsp;same&nbsp;search logic&nbsp;to&nbsp;drive&nbsp;Gutenberg&nbsp;themes, custom&nbsp;React\/Next.js frontends&nbsp;and&nbsp;even&nbsp;external&nbsp;tools&nbsp;without&nbsp;duplicating ranking or embedding&nbsp;code.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">AI\u2011generated summaries of&nbsp;results<\/h3>\n\n\n\n<p>On&nbsp;top of&nbsp;the&nbsp;ranked&nbsp;list, the plugin&nbsp;can generate&nbsp;a&nbsp;short AI summary of&nbsp;what the&nbsp;search&nbsp;results&nbsp;collectively&nbsp;say about&nbsp;the&nbsp;user\u2019s question. It&nbsp;does&nbsp;this by&nbsp;bundling the top&nbsp;hits&nbsp;(titles, types, URLs&nbsp;and excerpts) and sending them to&nbsp;the configured AI provider&nbsp;with&nbsp;an&nbsp;editor\u2011defined system prompt. The&nbsp;summary is always&nbsp;based&nbsp;on&nbsp;content&nbsp;that&nbsp;has already been retrieved&nbsp;and&nbsp;respects&nbsp;per\u2011post&nbsp;settings, authority&nbsp;levels and&nbsp;languages. Title&nbsp;and disclaimer text are configurable&nbsp;so&nbsp;you&nbsp;can&nbsp;clearly&nbsp;communicate&nbsp;that the&nbsp;summary is AI\u2011generated.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Observability and&nbsp;debug&nbsp;tools<\/h3>\n\n\n\n<p>To make&nbsp;all&nbsp;these&nbsp;layers&nbsp;understandable and&nbsp;trustworthy, iO Smart Search exposes&nbsp;rich debug information&nbsp;for&nbsp;administrators. For each&nbsp;query&nbsp;you can see&nbsp;the highest combined score&nbsp;across&nbsp;results, which&nbsp;provider&nbsp;and model&nbsp;were used and whether a&nbsp;fallback&nbsp;kicked&nbsp;in. On the&nbsp;result&nbsp;level&nbsp;you can inspect&nbsp;keyword&nbsp;scores, semantic scores, authority multipliers&nbsp;and&nbsp;content type. This makes it&nbsp;much easier to&nbsp;explain&nbsp;\u201cwhy&nbsp;did&nbsp;this page appear where&nbsp;it did?\u201d and to tune&nbsp;thresholds&nbsp;and&nbsp;weights&nbsp;with confidence.<\/p>\n\n\n\n<p>Taken&nbsp;together, these technical&nbsp;components&nbsp;turn&nbsp;WordPress search&nbsp;from a&nbsp;simple&nbsp;text&nbsp;filter into a controlled, observable search&nbsp;pipeline: one&nbsp;that understands&nbsp;meaning, respects&nbsp;editorial&nbsp;priorities, tolerates&nbsp;real\u2011world&nbsp;user behaviour and&nbsp;remains&nbsp;portable&nbsp;across&nbsp;themes, environments&nbsp;and AI providers.<\/p>\n\n<\/div>\n\n\t<\/div>\n<\/section>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-16","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/pilago-ai.io-dev.se\/index.php?rest_route=\/wp\/v2\/pages\/16","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pilago-ai.io-dev.se\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/pilago-ai.io-dev.se\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/pilago-ai.io-dev.se\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pilago-ai.io-dev.se\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=16"}],"version-history":[{"count":3,"href":"https:\/\/pilago-ai.io-dev.se\/index.php?rest_route=\/wp\/v2\/pages\/16\/revisions"}],"predecessor-version":[{"id":103,"href":"https:\/\/pilago-ai.io-dev.se\/index.php?rest_route=\/wp\/v2\/pages\/16\/revisions\/103"}],"wp:attachment":[{"href":"https:\/\/pilago-ai.io-dev.se\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=16"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}