<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 -->
<p>Full-text search is a critical capability for modern applications, enabling users to find relevant information across massive graph datasets using natural language queries, keywords, and sophisticated matching algorithms. Geode provides enterprise-grade full-text search capabilities fully integrated with its GQL query language, allowing you to combine graph traversal with powerful text search in a single query.</p>
<p>As an ISO/IEC 39075:2024 GQL-compliant graph database, Geode’s search functionality goes beyond simple substring matching, offering advanced features like relevance ranking, fuzzy matching, phonetic search, and multilingual support. Whether you’re building a content management system, e-commerce platform, knowledge graph, or social network, Geode’s search capabilities enable fast, accurate, and scalable text retrieval.</p>
<h3 id="understanding-full-text-search-in-geode" class="position-relative d-flex align-items-center group">
<span>Understanding Full-Text Search in Geode</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="understanding-full-text-search-in-geode"
aria-haspopup="dialog"
aria-label="Share link: Understanding Full-Text Search in Geode">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden>
<div class="hsm-dialog" role="document">
<div class="hsm-header">
<h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2>
<button type="button" class="hsm-close" aria-label="Close">
<i class="fa-solid fa-xmark"></i>
</button>
</div>
<div class="hsm-body">
<label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label>
<div class="input-group mb-4 hsm-url-group">
<input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" />
<button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy">
<i class="fa-duotone fa-clipboard" aria-hidden="true"></i>
</button>
</div>
<div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div>
<div class="hsm-share-grid">
<a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-twitter me-2"></i>Twitter
</a>
<a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-linkedin me-2"></i>LinkedIn
</a>
<a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer">
<i class="fa-brands fa-facebook me-2"></i>Facebook
</a>
</div>
</div>
</div>
</div>
<style>
.heading-share-modal {
position: fixed;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
background: rgba(0, 0, 0, 0.6);
z-index: 1050;
padding: 1rem;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
}
.heading-share-modal[hidden] { display: none !important; }
.hsm-dialog {
max-width: 420px;
width: 100%;
background: var(--bs-body-bg, #fff);
color: var(--bs-body-color, #212529);
border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
border-radius: 1rem;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
overflow: hidden;
animation: hsm-fade-in 0.2s ease-out;
}
@keyframes hsm-fade-in {
from { opacity: 0; transform: scale(0.95); }
to { opacity: 1; transform: scale(1); }
}
[data-bs-theme="dark"] .hsm-dialog {
background: #1e293b;
border-color: rgba(255,255,255,0.1);
color: #f8f9fa;
}
.hsm-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 1.5rem;
border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1));
background: rgba(0,0,0,0.02);
}
[data-bs-theme="dark"] .hsm-header {
background: rgba(255,255,255,0.02);
border-color: rgba(255,255,255,0.1);
}
.hsm-close {
background: transparent;
border: none;
color: inherit;
opacity: 0.5;
padding: 0.25rem 0.5rem;
border-radius: 0.25rem;
font-size: 1.2rem;
line-height: 1;
transition: opacity 0.2s;
}
.hsm-close:hover {
opacity: 1;
}
.hsm-body {
padding: 1.5rem;
}
.hsm-url-group {
display: flex !important;
align-items: stretch;
}
.hsm-url-group .form-control {
flex: 1;
min-width: 0;
margin: 0;
background: var(--bs-secondary-bg, #f8f9fa);
border-color: var(--bs-border-color, #dee2e6);
border-top-right-radius: 0;
border-bottom-right-radius: 0;
height: 42px;
}
.hsm-url-group .btn {
flex: 0 0 auto;
margin: 0;
margin-left: -1px;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
height: 42px;
display: flex;
align-items: center;
justify-content: center;
padding: 0 1.25rem;
z-index: 2;
}
[data-bs-theme="dark"] .hsm-url-group .form-control {
background: #0f172a;
border-color: #334155;
color: #e2e8f0;
}
.hsm-share-grid {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.hsm-share-grid .btn {
display: flex;
align-items: center;
justify-content: center;
font-size: 0.9rem;
padding: 0.6rem;
border-color: var(--bs-border-color);
width: 100%;
}
[data-bs-theme="dark"] .hsm-share-grid .btn {
color: #e2e8f0;
border-color: #475569;
}
[data-bs-theme="dark"] .hsm-share-grid .btn:hover {
background: #334155;
border-color: #cbd5e1;
}
</style>
<script>
(function(){
const modal = document.getElementById('headingShareModal');
if(!modal) return;
const input = modal.querySelector('#headingShareInput');
const copyBtn = modal.querySelector('.hsm-copy');
const twitter = modal.querySelector('#share-twitter');
const linkedin = modal.querySelector('#share-linkedin');
const facebook = modal.querySelector('#share-facebook');
const closeBtn = modal.querySelector('.hsm-close');
let lastFocus=null;
let trapBound=false;
function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; }
function isOpen(){ return !modal.hasAttribute('hidden'); }
function hydrate(id){
const url=buildUrl(id);
input.value=url;
const enc=encodeURIComponent(url);
const text=encodeURIComponent(document.title);
if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`;
if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`;
if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`;
}
function openModal(id){
lastFocus=document.activeElement;
hydrate(id);
if(!isOpen()){
modal.removeAttribute('hidden');
}
requestAnimationFrame(()=>{ input.focus(); });
trapFocus();
}
function closeModal(){
if(!isOpen()) return;
modal.setAttribute('hidden','');
if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus();
}
function copyCurrent(){
try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); }
catch(e){ fallback(); }
}
function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} }
function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); }
function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); }
function bindShareButtons(){
document.querySelectorAll('.h-share').forEach(btn=>{
if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; }
});
}
bindShareButtons();
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded', bindShareButtons);
} else {
requestAnimationFrame(bindShareButtons);
}
document.addEventListener('click', function(e){
const shareBtn=e.target.closest && e.target.closest('.h-share');
if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); }
}, true);
document.addEventListener('click', e=>{
if(e.target===modal) closeModal();
if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); }
if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); }
});
document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); });
function trapFocus(){
if(trapBound) return;
trapBound=true;
modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } });
}
if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); });
})();
</script><p>Traditional substring matching using <code>CONTAINS</code> or pattern matching with regular expressions works well for exact searches but struggles with natural language queries, relevance ranking, and large-scale text retrieval. Full-text search indexes solve these challenges by tokenizing text, normalizing terms, and building inverted indexes that enable millisecond-speed searches across millions of documents.</p>
<p><strong>Tokenization and Normalization</strong>: When you create a full-text index, Geode tokenizes text properties into individual terms, applies stemming (reducing words to root forms), removes stop words (common words like “the”, “and”, “or”), and normalizes case. This preprocessing enables intelligent matching that finds “running” when searching for “run” or “database” when searching for “databases”.</p>
<p><strong>Inverted Indexes</strong>: Geode maintains inverted indexes that map terms to the graph elements containing them. This data structure enables fast lookups: instead of scanning every node’s text property, Geode consults the index to instantly retrieve matching elements.</p>
<p><strong>Relevance Ranking</strong>: Search results are ranked by relevance using TF-IDF (Term Frequency-Inverse Document Frequency) scoring. Terms that appear frequently in a document but rarely across all documents receive higher scores, ensuring the most relevant results appear first.</p>
<p><strong>Query Language Integration</strong>: Unlike standalone search engines that require separate queries and result merging, Geode’s full-text search integrates seamlessly with GQL. You can combine graph patterns, property filters, and text search in a single query, leveraging the power of both paradigms.</p>
<h3 id="creating-and-managing-full-text-indexes" class="position-relative d-flex align-items-center group">
<span>Creating and Managing Full-Text Indexes</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="creating-and-managing-full-text-indexes"
aria-haspopup="dialog"
aria-label="Share link: Creating and Managing Full-Text Indexes">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Geode provides GQL syntax for creating and managing full-text indexes:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">a</span><span class="w"> </span><span class="py">full</span><span class="err">-</span><span class="py">text</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">a</span><span class="w"> </span><span class="py">single</span><span class="w"> </span><span class="py">property</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">FULLTEXT</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">article_title</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Article</span><span class="p">(</span><span class="py">title</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">a</span><span class="w"> </span><span class="py">multi</span><span class="err">-</span><span class="py">property</span><span class="w"> </span><span class="py">full</span><span class="err">-</span><span class="py">text</span><span class="w"> </span><span class="py">index</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">FULLTEXT</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">article_search</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Article</span><span class="p">(</span><span class="py">title</span><span class="p">,</span><span class="w"> </span><span class="py">body</span><span class="p">,</span><span class="w"> </span><span class="py">summary</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">a</span><span class="w"> </span><span class="py">full</span><span class="err">-</span><span class="py">text</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">custom</span><span class="w"> </span><span class="py">configuration</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">FULLTEXT</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">product_search</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Product</span><span class="p">(</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">description</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">language</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">english</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">stemming</span><span class="p">:</span><span class="w"> </span><span class="nc">true</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">stop_words</span><span class="p">:</span><span class="w"> </span><span class="nc">true</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">min_token_length</span><span class="p">:</span><span class="w"> </span><span class="nc">3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">View</span><span class="w"> </span><span class="py">all</span><span class="w"> </span><span class="py">full</span><span class="err">-</span><span class="py">text</span><span class="w"> </span><span class="py">indexes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SHOW</span><span class="w"> </span><span class="py">FULLTEXT</span><span class="w"> </span><span class="py">INDEXES</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Drop</span><span class="w"> </span><span class="py">a</span><span class="w"> </span><span class="py">full</span><span class="err">-</span><span class="py">text</span><span class="w"> </span><span class="py">index</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">DROP</span><span class="w"> </span><span class="py">FULLTEXT</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">article_search</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Index Configuration Options</strong>:</p>
<ul>
<li><code>language</code>: Specifies the language for stemming and stop word removal (e.g., ’english’, ‘spanish’, ‘french’)</li>
<li><code>stemming</code>: Enable or disable word stemming (default: true)</li>
<li><code>stop_words</code>: Enable or disable stop word removal (default: true)</li>
<li><code>min_token_length</code>: Minimum character length for indexed tokens (default: 2)</li>
<li><code>case_sensitive</code>: Preserve case distinctions (default: false)</li>
<li><code>accent_sensitive</code>: Preserve accent/diacritic distinctions (default: false)</li>
</ul>
<h3 id="basic-search-queries" class="position-relative d-flex align-items-center group">
<span>Basic Search Queries</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="basic-search-queries"
aria-haspopup="dialog"
aria-label="Share link: Basic Search Queries">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Once you’ve created a full-text index, use the <code>MATCHES</code> operator to perform text searches:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Simple</span><span class="w"> </span><span class="py">keyword</span><span class="w"> </span><span class="py">search</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Article</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">title</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">graph</span><span class="w"> </span><span class="py">database</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">title</span><span class="p">,</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">published_at</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">score</span><span class="p">(</span><span class="py">a</span><span class="p">)</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Multi</span><span class="err">-</span><span class="py">term</span><span class="w"> </span><span class="py">search</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">automatic</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">logic</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">description</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">wireless</span><span class="w"> </span><span class="py">bluetooth</span><span class="w"> </span><span class="py">headphones</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">price</span><span class="p">,</span><span class="w"> </span><span class="py">score</span><span class="p">(</span><span class="py">p</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">relevance</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">relevance</span><span class="w"> </span><span class="py">DESC</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">10</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Search</span><span class="w"> </span><span class="py">across</span><span class="w"> </span><span class="py">multiple</span><span class="w"> </span><span class="py">properties</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">software</span><span class="w"> </span><span class="py">engineer</span><span class="err">'</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Searches</span><span class="w"> </span><span class="py">all</span><span class="w"> </span><span class="py">indexed</span><span class="w"> </span><span class="py">properties</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">bio</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p>The <code>score()</code> function returns the relevance score for search results, enabling you to sort by relevance and filter by minimum score thresholds.</p>
<h3 id="advanced-search-operators" class="position-relative d-flex align-items-center group">
<span>Advanced Search Operators</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="advanced-search-operators"
aria-haspopup="dialog"
aria-label="Share link: Advanced Search Operators">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Geode supports sophisticated search operators for precise control over matching behavior:</p>
<p><strong>Boolean Operators</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">AND</span><span class="p">:</span><span class="w"> </span><span class="nc">All</span><span class="w"> </span><span class="py">terms</span><span class="w"> </span><span class="py">must</span><span class="w"> </span><span class="py">match</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Article</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">body</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'+</span><span class="py">graph</span><span class="w"> </span><span class="err">+</span><span class="py">database</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">a</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">OR</span><span class="p">:</span><span class="w"> </span><span class="nc">Any</span><span class="w"> </span><span class="py">term</span><span class="w"> </span><span class="py">can</span><span class="w"> </span><span class="py">match</span><span class="w"> </span><span class="p">(</span><span class="py">default</span><span class="w"> </span><span class="py">behavior</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Article</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">body</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">graph</span><span class="w"> </span><span class="py">OR</span><span class="w"> </span><span class="py">database</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">a</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">NOT</span><span class="p">:</span><span class="w"> </span><span class="nc">Exclude</span><span class="w"> </span><span class="py">terms</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Article</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">body</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">database</span><span class="w"> </span><span class="err">-</span><span class="py">relational</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">a</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Complex</span><span class="w"> </span><span class="py">boolean</span><span class="w"> </span><span class="py">expressions</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">description</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="p">(</span><span class="py">laptop</span><span class="w"> </span><span class="py">OR</span><span class="w"> </span><span class="py">notebook</span><span class="p">)</span><span class="w"> </span><span class="err">+</span><span class="py">gaming</span><span class="w"> </span><span class="err">-</span><span class="py">used</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Phrase Searches</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Exact</span><span class="w"> </span><span class="py">phrase</span><span class="w"> </span><span class="py">matching</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Article</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">title</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="s">"artificial intelligence"</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">a</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Phrase</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">proximity</span><span class="w"> </span><span class="p">(</span><span class="py">words</span><span class="w"> </span><span class="py">within</span><span class="w"> </span><span class="py">N</span><span class="w"> </span><span class="py">positions</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Article</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">body</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="s">"graph database"</span><span class="err">~</span><span class="py">5</span><span class="err">'</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Within</span><span class="w"> </span><span class="py">5</span><span class="w"> </span><span class="py">words</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">a</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Wildcard and Fuzzy Matching</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Wildcard</span><span class="w"> </span><span class="py">searches</span><span class="w"> </span><span class="p">(</span><span class="err">*</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">multiple</span><span class="w"> </span><span class="py">chars</span><span class="p">,</span><span class="w"> </span><span class="err">?</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">single</span><span class="w"> </span><span class="py">char</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">email</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">admin</span><span class="err">*</span><span class="nd">@example</span><span class="err">.</span><span class="py">com</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Fuzzy</span><span class="w"> </span><span class="py">matching</span><span class="w"> </span><span class="p">(</span><span class="py">tolerates</span><span class="w"> </span><span class="py">spelling</span><span class="w"> </span><span class="py">errors</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">laptop</span><span class="err">~</span><span class="py">2</span><span class="err">'</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Allow</span><span class="w"> </span><span class="py">2</span><span class="w"> </span><span class="py">character</span><span class="w"> </span><span class="py">differences</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Prefix Searches</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Find</span><span class="w"> </span><span class="py">terms</span><span class="w"> </span><span class="py">starting</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">prefix</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">t</span><span class="p">:</span><span class="nc">Tag</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">t</span><span class="err">.</span><span class="py">name</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">data</span><span class="err">*'</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Matches</span><span class="w"> </span><span class="err">'</span><span class="py">database</span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="py">data</span><span class="w"> </span><span class="py">science</span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="py">etc</span><span class="err">.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">t</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="combining-search-with-graph-patterns" class="position-relative d-flex align-items-center group">
<span>Combining Search with Graph Patterns</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="combining-search-with-graph-patterns"
aria-haspopup="dialog"
aria-label="Share link: Combining Search with Graph Patterns">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>The true power of Geode’s search emerges when combining full-text search with graph traversal:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Find</span><span class="w"> </span><span class="py">experts</span><span class="w"> </span><span class="py">connected</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">users</span><span class="w"> </span><span class="py">searching</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">topics</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">expert</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">AUTHORED</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">article</span><span class="p">:</span><span class="nc">Article</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">article</span><span class="err">.</span><span class="py">body</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">machine</span><span class="w"> </span><span class="py">learning</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">expert</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="py">article</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">article_count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">article_count</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Search</span><span class="w"> </span><span class="py">within</span><span class="w"> </span><span class="py">a</span><span class="w"> </span><span class="py">subgraph</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">category</span><span class="p">:</span><span class="nc">Category</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Technology</span><span class="err">'</span><span class="p">})</span><span class="err">-</span><span class="p">[:</span><span class="nc">CONTAINS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">product</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">product</span><span class="err">.</span><span class="py">description</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">wireless</span><span class="w"> </span><span class="py">charging</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">product</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">product</span><span class="err">.</span><span class="py">price</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">score</span><span class="p">(</span><span class="py">product</span><span class="p">)</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Find</span><span class="w"> </span><span class="py">shortest</span><span class="w"> </span><span class="py">paths</span><span class="w"> </span><span class="py">through</span><span class="w"> </span><span class="py">content</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="py">path</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">shortestPath</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(</span><span class="py">start</span><span class="p">:</span><span class="nc">Topic</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Databases</span><span class="err">'</span><span class="p">})</span><span class="err">-</span><span class="p">[</span><span class="err">*.</span><span class="mf">.5</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">end</span><span class="p">:</span><span class="nc">Topic</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">end</span><span class="err">.</span><span class="py">description</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">real</span><span class="err">-</span><span class="py">time</span><span class="w"> </span><span class="py">analytics</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">path</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="multilingual-search" class="position-relative d-flex align-items-center group">
<span>Multilingual Search</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="multilingual-search"
aria-haspopup="dialog"
aria-label="Share link: Multilingual Search">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p>Geode supports full-text search across multiple languages with language-specific tokenization and stemming:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">language</span><span class="err">-</span><span class="py">specific</span><span class="w"> </span><span class="py">indexes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">FULLTEXT</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">article_en</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Article</span><span class="p">(</span><span class="py">title_en</span><span class="p">,</span><span class="w"> </span><span class="py">body_en</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="p">(</span><span class="py">language</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">english</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">FULLTEXT</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">article_es</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Article</span><span class="p">(</span><span class="py">title_es</span><span class="p">,</span><span class="w"> </span><span class="py">body_es</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="p">(</span><span class="py">language</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">spanish</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">FULLTEXT</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">article_fr</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Article</span><span class="p">(</span><span class="py">title_fr</span><span class="p">,</span><span class="w"> </span><span class="py">body_fr</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="p">(</span><span class="py">language</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">french</span><span class="err">'</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">language</span><span class="err">-</span><span class="py">specific</span><span class="w"> </span><span class="py">matching</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Article</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">body_es</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">base</span><span class="w"> </span><span class="py">de</span><span class="w"> </span><span class="py">datos</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">title_es</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Supported Languages</strong>:</p>
<ul>
<li>English, Spanish, French, German, Italian, Portuguese</li>
<li>Chinese (simplified and traditional), Japanese, Korean</li>
<li>Russian, Arabic, Hindi</li>
<li>And 40+ additional languages with Unicode normalization</li>
</ul>
<h3 id="search-performance-optimization" class="position-relative d-flex align-items-center group">
<span>Search Performance Optimization</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="search-performance-optimization"
aria-haspopup="dialog"
aria-label="Share link: Search Performance Optimization">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p><strong>Index-Only Queries</strong>: When possible, structure queries to retrieve data directly from the full-text index without accessing base properties:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Efficient</span><span class="p">:</span><span class="w"> </span><span class="nc">Returns</span><span class="w"> </span><span class="kd">on</span><span class="py">ly</span><span class="w"> </span><span class="py">indexed</span><span class="w"> </span><span class="py">data</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Article</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">title</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">database</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">title</span><span class="p">,</span><span class="w"> </span><span class="py">score</span><span class="p">(</span><span class="py">a</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Less</span><span class="w"> </span><span class="py">efficient</span><span class="p">:</span><span class="w"> </span><span class="nc">Requires</span><span class="w"> </span><span class="py">base</span><span class="w"> </span><span class="py">data</span><span class="w"> </span><span class="py">access</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Article</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">title</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">database</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">title</span><span class="p">,</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">author</span><span class="p">,</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">metadata</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Non</span><span class="err">-</span><span class="py">indexed</span><span class="w"> </span><span class="py">properties</span><span class="w">
</span></span></span></code></pre></div><p><strong>Result Limiting</strong>: Always use <code>LIMIT</code> for search queries to prevent retrieving massive result sets:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">description</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">laptop</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">score</span><span class="p">(</span><span class="py">p</span><span class="p">)</span><span class="w"> </span><span class="py">DESC</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">50</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Minimum Score Filtering</strong>: Filter low-relevance results to reduce processing:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Article</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">body</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">graph</span><span class="w"> </span><span class="py">database</span><span class="err">'</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">score</span><span class="p">(</span><span class="py">a</span><span class="p">)</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">0</span><span class="mf">.5</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">title</span><span class="p">,</span><span class="w"> </span><span class="py">score</span><span class="p">(</span><span class="py">a</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">score</span><span class="p">(</span><span class="py">a</span><span class="p">)</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Query Profiling</strong>: Use <code>PROFILE</code> to analyze search performance:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Article</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">body</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">distributed</span><span class="w"> </span><span class="py">systems</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">title</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">score</span><span class="p">(</span><span class="py">a</span><span class="p">)</span><span class="w"> </span><span class="py">DESC</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">20</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="advanced-search-features" class="position-relative d-flex align-items-center group">
<span>Advanced Search Features</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="advanced-search-features"
aria-haspopup="dialog"
aria-label="Share link: Advanced Search Features">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p><strong>Highlighting</strong>: Retrieve snippets showing matched terms in context:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Article</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">body</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">graph</span><span class="w"> </span><span class="py">database</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">title</span><span class="p">,</span><span class="w"> </span><span class="py">highlight</span><span class="p">(</span><span class="py">a</span><span class="err">.</span><span class="py">body</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="py">graph</span><span class="w"> </span><span class="py">database</span><span class="err">'</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">snippet</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Faceted Search</strong>: Combine search with aggregations for filtering:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">description</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">laptop</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">category</span><span class="p">,</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">count</span><span class="p">,</span><span class="w"> </span><span class="py">AVG</span><span class="p">(</span><span class="py">score</span><span class="p">(</span><span class="py">p</span><span class="p">))</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">avg_relevance</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">GROUP</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">category</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">avg_relevance</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><p><strong>Custom Scoring</strong>: Boost specific fields or combine relevance with other factors:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">laptop</span><span class="err">^</span><span class="py">2</span><span class="mf">.0</span><span class="err">'</span><span class="w"> </span><span class="py">OR</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">description</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">laptop</span><span class="err">'</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">score</span><span class="p">(</span><span class="py">p</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">relevance</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">rating</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="p">(</span><span class="py">score</span><span class="p">(</span><span class="py">p</span><span class="p">)</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">0</span><span class="mf">.7</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">rating</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">0</span><span class="mf">.3</span><span class="p">)</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="best-practices" class="position-relative d-flex align-items-center group">
<span>Best Practices</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="best-practices"
aria-haspopup="dialog"
aria-label="Share link: Best Practices">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ol>
<li>
<p><strong>Index Selectively</strong>: Full-text indexes consume significant memory. Only index properties that require text search capabilities.</p>
</li>
<li>
<p><strong>Use Multi-Property Indexes</strong>: Instead of creating separate indexes for title, body, and summary, create a single multi-property index for better performance.</p>
</li>
<li>
<p><strong>Monitor Index Size</strong>: Large text collections generate large indexes. Monitor disk usage and consider archiving or partitioning old content.</p>
</li>
<li>
<p><strong>Tune Tokenization</strong>: Adjust <code>min_token_length</code> and stop word lists based on your domain. Technical documentation may benefit from indexing 2-character terms, while general content works better with 3+ characters.</p>
</li>
<li>
<p><strong>Combine with Property Indexes</strong>: Use property indexes for structured filtering alongside full-text search:</p>
</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Article</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">published_at</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="err">'</span><span class="py">2024</span><span class="err">-</span><span class="py">01</span><span class="err">-</span><span class="py">01</span><span class="err">'</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Property</span><span class="w"> </span><span class="py">index</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">body</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">'</span><span class="py">graph</span><span class="w"> </span><span class="py">database</span><span class="err">'</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Full</span><span class="err">-</span><span class="py">text</span><span class="w"> </span><span class="py">index</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">a</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">score</span><span class="p">(</span><span class="py">a</span><span class="p">)</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div><ol start="6">
<li><strong>Test Language Settings</strong>: Verify stemming and stop word behavior matches your expectations for each language.</li>
</ol>
<h3 id="troubleshooting" class="position-relative d-flex align-items-center group">
<span>Troubleshooting</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="troubleshooting"
aria-haspopup="dialog"
aria-label="Share link: Troubleshooting">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p><strong>Low Relevance Scores</strong>: Check tokenization settings. Overly aggressive stemming or stop word removal may eliminate important terms.</p>
<p><strong>Missing Results</strong>: Verify index coverage. Multi-property indexes may not include all properties you’re searching.</p>
<p><strong>Slow Queries</strong>: Use <code>PROFILE</code> to identify bottlenecks. Consider adding property indexes for commonly filtered dimensions or limiting result sets.</p>
<p><strong>Phrase Search Failures</strong>: Ensure terms in phrase queries exist in the index. Check for stemming conflicts where search terms don’t match indexed stems.</p>
<h3 id="integration-with-other-geode-features" class="position-relative d-flex align-items-center group">
<span>Integration with Other Geode Features</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="integration-with-other-geode-features"
aria-haspopup="dialog"
aria-label="Share link: Integration with Other Geode Features">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><p><strong>Row-Level Security</strong>: Full-text search respects RLS policies, ensuring users only retrieve content they’re authorized to access.</p>
<p><strong>Transactions</strong>: Index updates occur transactionally. Uncommitted changes aren’t visible in search results until the transaction commits.</p>
<p><strong>Replication</strong>: Full-text indexes replicate across cluster nodes, enabling distributed search queries.</p>
<p><strong>Backups</strong>: Indexes are included in backup snapshots and restored alongside graph data.</p>
<h3 id="related-topics" class="position-relative d-flex align-items-center group">
<span>Related Topics</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="related-topics"
aria-haspopup="dialog"
aria-label="Share link: Related Topics">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li>Database Indexing Strategies</li>
<li>Query Optimization and Performance</li>
<li>Text Processing and Unicode Support</li>
<li>GQL Query Language Reference</li>
<li>Performance Monitoring and Profiling</li>
<li>Data Modeling Best Practices</li>
</ul>
<h3 id="further-reading" class="position-relative d-flex align-items-center group">
<span>Further Reading</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="further-reading"
aria-haspopup="dialog"
aria-label="Share link: Further Reading">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li>ISO/IEC 39075:2024 GQL Standard: Text search specifications</li>
<li>Full-Text Search Architecture Documentation</li>
<li>Index Management and Optimization Guide</li>
<li>Multilingual Search Configuration</li>
<li>Enterprise Search Patterns and Use Cases</li>
</ul>
Tag
1 article
Full-Text Search & Query Capabilities
Comprehensive guide to full-text search in Geode graph database. Learn about text indexing, search operators, ranking, and advanced query capabilities for enterprise search workloads.