{"id":98085,"date":"2026-10-12T10:14:00","date_gmt":"2026-10-12T14:14:00","guid":{"rendered":"https:\/\/overcentral.com\/en\/?p=98085"},"modified":"2026-09-29T08:12:41","modified_gmt":"2026-09-29T12:12:41","slug":"emdash-search-vs-wordpress-98085","status":"publish","type":"post","link":"https:\/\/overcentral.com\/en\/emdash-search-vs-wordpress-98085\/","title":{"rendered":"How EmDash Search Outsmarts WordPress Search"},"content":{"rendered":"<p>You probably think search is search. Type a word, get results. Done.<\/p>\n<p>That assumption is exactly what makes EmDash&#8217;s search so easy to underestimate. It&#8217;s not a better version of the same thing. It&#8217;s built on a completely different foundation that changes what search can actually do.<\/p>\n<p><a href=\"https:\/\/www.emdash.com\" target=\"_blank\" rel=\"noopener noreferrer\" data-iacss-external=\"1\">EmDash<\/a> stores content as structured JSON \u2014 a format called portable text \u2014 instead of the HTML blobs WordPress dumps into <code>post_content<\/code>codecodecodecode. That single architectural decision means EmDash&#8217;s search doesn&#8217;t just match keywords. It understands the <em>shape<\/em> of your content. It knows which field is a title, which is a body paragraph, which is a metadata tag, and which is an image caption. It can search each one independently or in combination.<\/p>\n<p>WordPress search can&#8217;t do that. It searches a mess of concatenated HTML and hopes for the best.<\/p>\n<p>Here&#8217;s what that means for anyone actually running a site.<\/p>\n<h2>The Architecture That Makes Search Smarter<\/h2>\n<p>EmDash runs on a D1 database (Cloudflare&#8217;s SQLite-based serverless database) with Astro handling the frontend. Every piece of content \u2014 every post, page, project, or custom content type \u2014 is stored as structured fields, not as a single blob of markup.<\/p>\n<p><a href=\"https:\/\/overcentral.com\/en\/eu-cra-reporting-requirements-80362\/\" title=\"EU CRA Demands What Shipped and When You Knew\" data-iacss-internal=\"1\">When you<\/a> create a content type in EmDash, you define each field individually. A &#8220;Project&#8221; content type might have a <code>client_name<\/code>codecodecodecode field, a <code>year<\/code>codecodecodecode field, a <code>description<\/code>codecodecodecode field (using portable text for rich formatting), and a <code>url<\/code>codecodecodecode field. Each one is a separate column in the database, with its own data type and index.<\/p>\n<p>Search operates on these individual fields, not on a rendered HTML string.<\/p>\n<p>That means you can tell EmDash: &#8220;Only search the title and description fields, not the URL field.&#8221; Or: &#8220;Boost results where the search term appears in the title over results where it appears in the body.&#8221; Or: &#8220;Exclude draft content from search entirely.&#8221;<\/p>\n<p>These are not post-install plugin features. They&#8217;re built into how the CMS handles data.<\/p>\n<h2>What EmDash Search Ships With Out of the Box<\/h2>\n<p>The default EmDash installation includes search functionality that covers the basics competently and a few things WordPress requires plugins for.<\/p>\n<table class=\"mw-table\">\n<thead>\n<tr>\n<th>Feature<\/th>\n<th>EmDash (built-in)<\/th>\n<th>WordPress (built-in)<\/th>\n<th>WordPress (with plugin)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Field-level search scoping<\/td>\n<td>Yes \u2014 per-field configuration in content types<\/td>\n<td>No \u2014 searches entire <code>post_content<\/code>codecodecodecode blob<\/td>\n<td>Yes \u2014 via Relevanssi or SearchWP<\/td>\n<\/tr>\n<tr>\n<td>SEO metadata as searchable fields<\/td>\n<td>Yes \u2014 title, description, canonical included by default<\/td>\n<td>No \u2014 requires Yoast or similar<\/td>\n<td>Yes<\/td>\n<\/tr>\n<tr>\n<td>Content type filtering<\/td>\n<td>Yes \u2014 native content type system<\/td>\n<td>No \u2014 only posts and pages<\/td>\n<td>Yes \u2014 via CPT plugin<\/td>\n<\/tr>\n<tr>\n<td>Draft\/status-aware search<\/td>\n<td>Yes \u2014 respects publication status<\/td>\n<td>Yes \u2014 respects status<\/td>\n<td>Same<\/td>\n<\/tr>\n<tr>\n<td>Search indexing for custom fields<\/td>\n<td>Yes \u2014 fields are database columns<\/td>\n<td>No \u2014 custom fields are in <code>wp_postmeta<\/code>codecodecodecode<\/td>\n<td>Yes \u2014 via ACF + search plugin<\/td>\n<\/tr>\n<tr>\n<td>Built-in sitemap integration<\/td>\n<td>Yes \u2014 content types can be marked SEO-enabled<\/td>\n<td>No \u2014 requires plugin<\/td>\n<td>Yes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The table makes it obvious: EmDash&#8217;s search advantage is architectural, not feature-bloated. It doesn&#8217;t add more stuff \u2014 it stores stuff better from the start.<\/p>\n<h2>How to Customize Search in EmDash<\/h2>\n<p>Customization happens at two levels: the content type definition and the query configuration.<\/p>\n<h3>Step 1: Configure Which Fields Are Searchable<\/h3>\n<p>When you create or edit a content type in EmDash, each field has a &#8220;searchable&#8221; toggle. You access this through the admin panel under <strong>Content Types<\/strong>.<\/p>\n<ol>\n<li>Go to <strong>Admin \u2192 Content Types<\/strong> in the EmDash dashboard.<\/li>\n<li>Select the content type you want to edit (Posts, Pages, Projects, or a custom one).<\/li>\n<li>Click on any field to open its configuration.<\/li>\n<li>Toggle <strong>Searchable<\/strong> on or off.<\/li>\n<\/ol>\n<p>Fields marked searchable get included in the full-text index. Fields you leave off \u2014 like internal notes, URLs, or system IDs \u2014 are excluded. This is a per-field decision, not a global setting.<\/p>\n<h3>Step 2: Mark Content Types for SEO<\/h3>\n<p>Content types also have an <strong>SEO Enabled<\/strong> toggle. When you enable this:<\/p>\n<ul>\n<li>The content type gets added to the XML sitemap automatically.<\/li>\n<li>SEO fields (title, description, og:image) become searchable and indexable.<\/li>\n<li>The sitemap respects your publication status \u2014 drafts don&#8217;t appear.<\/li>\n<\/ul>\n<p>This is how EmDash handles what WordPress requires Yoast or Rank Math to do. It&#8217;s not a plugin. It&#8217;s a checkbox on the content type definition.<\/p>\n<h3>Step 3: Use the Built-in MCP Server for Search Queries<\/h3>\n<p>EmDash ships with an MCP (Model Context Protocol) server. This isn&#8217;t a search feature for end users \u2014 it&#8217;s for developers and <a href=\"https:\/\/overcentral.com\/en\/rogue-ai-agents-liability-vacuum-97898\/\" title=\"Rogue AI agents expose liability vacuum as OpenAI faces claims\" data-iacss-internal=\"1\">AI agents<\/a>.<\/p>\n<p>You can connect Claude, Cursor, or any MCP-compatible tool to your EmDash instance and run structured search queries directly. For example:<\/p>\n<p>&#8220;Find all posts where the description field contains &#8216;TypeScript&#8217; and the status is published, then return the title and URL.&#8221;<\/p>\n<p>The MCP server translates that into the correct database query against the structured fields. No parsing HTML. No regex scraping content. The agent gets exactly the fields it asked for.<\/p>\n<p>This is the AI-native search angle that WordPress is still trying to retrofit.<\/p>\n<h3>Step 4: Customize the Frontend Search Experience<\/h3>\n<p>The default EmDash starter templates (Blog, Marketing Site, Portfolio) include a basic search interface. If you want something different, you build it in Astro \u2014 which is the frontend framework EmDash uses.<\/p>\n<p>Astro components receive content as structured data, not rendered HTML. So a <a href=\"https:\/\/overcentral.com\/en\/google-shopping-removed-europe-81524\/\" title=\"Google Shopping Drops from Search Results in Europe\" data-iacss-internal=\"1\">search results<\/a> component can display individual fields (title, excerpt, date, author) without parsing anything. You query the D1 database through EmDash&#8217;s API, filter by searchable fields, and render the results in whatever layout you want.<\/p>\n<p>This is the same architecture that makes static site generation fast. The search index is built at build time or queried at runtime through Cloudflare Workers, depending on how you configure it.<\/p>\n<h2>The One Thing Search Doesn&#8217;t Do Yet<\/h2>\n<p>EmDash is version 0.1.0. Some search features you&#8217;d expect aren&#8217;t there yet.<\/p>\n<ul>\n<li><strong>No built-in fuzzy matching.<\/strong> WordPress plugins can do &#8220;did you mean&#8221; corrections. EmDash&#8217;s current search is exact-match on indexed fields.<\/li>\n<li><strong>No autocomplete\/suggestions.<\/strong> The frontend templates don&#8217;t include a predictive search dropdown. You&#8217;d need to build that yourself with a custom Astro component and a D1 query.<\/li>\n<li><strong>No search analytics.<\/strong> WordPress plugins track what users search for and what they click. EmDash doesn&#8217;t log search queries yet.<\/li>\n<\/ul>\n<p>These are solvable problems. The architecture supports them. But they&#8217;re not shipped in the beta.<\/p>\n<h2>When Structured Search Breaks Down<\/h2>\n<p>There&#8217;s a scenario where EmDash&#8217;s approach actually hurts: highly visual, unstructured content.<\/p>\n<p>If your site relies on complex HTML layouts \u2014 think page builders like Elementor or Divi \u2014 the content isn&#8217;t stored as clean fields. It&#8217;s stored as nested HTML blocks inside a single field. Structured search can&#8217;t parse &#8220;the third paragraph inside the second column of the hero section&#8221; because that structure is markup, not data.<\/p>\n<p>The WordPress migration tool handles this by importing the raw HTML into a single content field. Search treats it as one blob, just like WordPress does. You lose the field-level advantage.<\/p>\n<p>For new sites designed for EmDash, this isn&#8217;t a problem. You define the fields upfront. But if you&#8217;re migrating a 500-page Elementor site, your search experience will be closer to WordPress than to native EmDash.<\/p>\n<h2>What This Changes About How You Think of Search<\/h2>\n<p>Search isn&#8217;t an afterthought you bolt on with a plugin. It&#8217;s a function of how you store your data.<\/p>\n<p>WordPress stores content as HTML. Search is a text-matching problem against that HTML. EmDash stores content as typed, structured fields. Search is a query problem against those fields.<\/p>\n<p>One requires plugins to work well. The other requires planning upfront.<\/p>\n<p>That&#8217;s the tradeoff. EmDash asks you to think about your content model before you start writing. WordPress lets you write first and figure out search later. If you take the time to define your content types and fields properly, EmDash&#8217;s search is faster, more precise, and more flexible than anything WordPress offers without third-party plugins.<\/p>\n<p>If you don&#8217;t, it&#8217;s just another search bar.<\/p>\n<p>The counterintuitive truth is that EmDash&#8217;s search isn&#8217;t really about the search box at all. It&#8217;s about the content model. Get that right, and the search takes care of itself.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>You probably think search is search. Type a word, get results. Done. That assumption is exactly what makes EmDash&#8217;s search so easy to underestimate. It&#8217;s not a better version of the same thing. It&#8217;s built on a completely different foundation that changes what search can actually do. EmDash stores content as structured JSON \u2014 a [&hellip;]<\/p>\n","protected":false},"author":7,"featured_media":100349,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/98085.png","fifu_image_alt":"How EmDash Search Outsmarts WordPress Search","footnotes":""},"categories":[31],"tags":[],"class_list":["post-98085","post","type-post","status-publish","format-standard","has-post-thumbnail","category-technology"],"fifu_image_url":"https:\/\/cards.overcentral.com\/cards\/en\/98085.png","fifu_image_alt":"How EmDash Search Outsmarts WordPress Search","_links":{"self":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98085","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/comments?post=98085"}],"version-history":[{"count":1,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98085\/revisions"}],"predecessor-version":[{"id":100350,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/posts\/98085\/revisions\/100350"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media\/100349"}],"wp:attachment":[{"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/media?parent=98085"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/categories?post=98085"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/overcentral.com\/en\/wp-json\/wp\/v2\/tags?post=98085"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}