Site:n korjaaminen's haku: PostgreSQL Full M SK2Text Search (ja missä se katkeaaMSC4 (Suomi (Finnish))

Site:n korjaaminen's haku: PostgreSQL Full M SK2Text Search (ja missä se katkeaaMSC4

Wednesday, 14 January 2026

//

12 minute read

haku on yksi niistä ominaisuuksista, joita kaikki aliarvioivat. Se vaikuttaa merkityksettömältä, kunnes todelliset käyttäjät alkavat kirjoittaa todellisia kysymyksiä. käsitteellisesti oikea mutta tekstinvastainen. Kun haku epäonnistuu näissä tapauksissaM SK1 käyttäjät eivät 'koskaa "silmäkohtainen tapaus

On myös järjetöntä, että ”'” on häirinnyt tätä sivustoa sen jälkeen kun se alun perin otettiin käyttöön. Avoin haku, on työskennellyt PostgreSQLin täytäntöönpanoa koskevassa tekstin etsinnössä sen kanssa ' fancy vector stuff, mutta ei koskaan ollut aidosti tyytyväinen siihen hätiköity minä erityisesti nyt I' olen rakentamassa hakuvälinettä ilmeinenRAG No, mielestäni minun olisi lopultakin korjattava se. Se, onko se totta vai ei, on toinen asia.

Tässä artiklassa ei ole kyse ' -tarkoituksista rakentaa hakukoneesta alusta alkaen, vaan .-tarkoituksesta korjata PostgreSQLin täsmälliset reunat, "M SK3" -tekstin etsintä todellisessa tuotantojärjestelmässä, . -niminen, "I"-niminen", "I5" -lähestyisin niihin erityisiin virheisiin, joita kohtasin, "SSK6" -kysymyksiin, jotka johtuvat tapahtuneista tapahtumista, "MSSK7" -tapaukseen ja käytännön korjauksiin, joita tarvitaan, jotta haku käyttäytyisi niin kuin käyttäjät jo odottavat.

Aikaisemman työn pohjalta: Tässä artiklassa laajennetaan semanttisten hakujen toteuttaminen , jossa lisättiin ristiriitainen haku Reciprocal Rank Fusionin kanssa. (RRF). Edellinen artikkeli käsitteli perustaa.

Semanttinen hakuinfrastruktuuri palvelee kahta tarkoitusta: ja tarjoaa jäljittämislaitteen Oikeusasiamies GPT RAG-järjestelmä -kirjanpitäjä, joka laatii uusia työpaikkoja käyttäen sivustoa' olemassa oleva tietopohjana oleva sisältöM SK2 syvemmän katsauksen taustalla oleviin tekniikkoihin "Lawyer GPTM SK1 – Osa SSK3 embeddings ja vector search.

Ongelmat

1. Empty Results Showed Random Articles

Kun haku ei tuonut tulosta, järjestelmä oli näyttämässä sattumanvaraisia vanhoja artikloita hyödyllisten ehdotusten sijasta . Tämä rikkoi vähiten yllättämisen periaatetta M SK2 käyttäjät odottivat joko asiaankuuluvia tuloksia tai selvää |" |ei löydetty yhteensopivuutta | " |viesti viimeaikaisten toimien perusteella ehdotuksina |

Ratkaisu: Muutettu BlogSearchService.HybridSearchWithPagingAsync() tunnistaa, kun haku tuottaa nollatulokset ja palauttaa viimeisimpien, päivämäärää laskemalla järjestettyjen postitusten luetteloon. NoMatchFound lippu BasePagingModel niin että UI voi esittää asianmukaisen viestin, kuten "Ei löydetty yhdistelmää.

// No match found - return recent posts as suggestions
if (noMatchFound)
{
    Log.Logger.Information("No search results for '{Query}', returning recent posts as suggestions", query);
    return await GetRecentPostsAsSuggestions(targetLanguage, startDate, endDate, page, pageSize);
}

2. Tällaiset acronymit kuin "DiSE

PostgreSQL's default English text search configuration technically indexes acronyms, but normalization and stemming make shortMSC2 caseM SK3significant terms unreliable in practice . Kun etsiä MST5DiSEMSP6 se laskee lowercased to SSK7diseMSL8 ja sitten englanninkielinen sanasto voi hylätä sen tai antaa sille alhaisen painon.

Ratkaisu: lisättiin acronym-selvitys (terms ≤6hedelmät, joissa on uppercase- अक्षरtM SK3 ja tapaus-insensitive substring fallback PostgreSQLin avulla ILIKE. Tämä täydentää täytäntöönpanoon liittyvää tekstitarkistusta, eikä korvaa sitä.

// Detect if query looks like an acronym or short term
var isAcronymLike = query.Length <= 6 && query.Any(char.IsUpper);

// Add substring search for acronyms
searchQuery = searchQuery.Where(x =>
    EF.Functions.ILike(x.Title, $"%{acronym}%")
    || EF.Functions.ILike(x.PlainTextContent, $"%{acronym}%"));

3. Tekniset ehdot, joissa on erityispiirteitä

hakut "ASP.NETM SK2 tai "C#" epäonnistuisivat, koska PostgreSQL'n tekstin parsaattori treats periods and hash symbols as delimiters.

Ratkaisu: On luotu SearchQueryParser joka tunnustaa yhteiset tekniset termit ja korvaa ne hakukelpoisilla versioilla:

private static readonly Dictionary<string, string> TechnicalTerms = new(StringComparer.OrdinalIgnoreCase)
{
    ["asp.net"] = "aspnet",
    ["c#"] = "csharp",
    [".net"] = "dotnet",
    ["f#"] = "fsharp",
    ["node.js"] = "nodejs",
    // ... more terms
};

4. Sellaiset kysymykset kuin "ASP.NET ja AlpineM SK3 Ette toimi

PostgreSQL kohtelee "ja" pysähdyssanaksi ja poistaa sen hakujen ulkopuolelle.

Ratkaisu: On otettu käyttöön Googlen mallia käyttävä kyselyparsaattori, joka käsittelee stop-sanoja älykkäästi ja tukee kehittyneitä hakuoperaattoreita.

Ratkaisut

Google-Stylen hakuoperaattorit

Olen toteuttanut SearchQueryParser luokka, jossa analysoidaan kysymyksiä tukemalla:

  1. Luetellut lausekkeet: "exact match" - etsii täsmällistä ilmausta
  2. Poikkeukselliset ehdot: -unwanted - ei sisällä tätä termiä sisältäviä tuloksia
  3. Wildcardit: ASP* - vastaukset "ASPM SK2 "AspNET", "ASPNetCoreMST6 jneMSC7
  4. Tekniset ehdot: Automaattinen käsitys

Parsaattori käyttää koottua regex-mallia kysymyksen merkitsemiseksi:

[GeneratedRegex(@"""([^""]+)""|(-)?(\S+)", RegexOptions.Compiled)]
private static partial Regex QueryTokenRegex();

public ParsedQuery Parse(string query)
{
    var matches = QueryTokenRegex().Matches(processedQuery);

    foreach (Match match in matches)
    {
        // Quoted phrase
        if (match.Groups[1].Success)
        {
            var phrase = match.Groups[1].Value.Trim();
            result.Phrases.Add(phrase);
            continue;
        }

        // Excluded term (starts with -)
        if (match.Groups[2].Success)
        {
            var term = match.Groups[3].Value.Trim();
            result.ExcludeTerms.Add(term.ToLowerInvariant());
            continue;
        }

        // Regular term or wildcard
        var token = match.Groups[3].Value.Trim();
        if (token.Contains('*'))
        {
            result.WildcardTerms.Add(token.Replace("*", ""));
        }
        else if (!StopWords.Contains(token))
        {
            result.IncludeTerms.Add(token.ToLowerInvariant());
        }
    }
}

Rakennetaan PostgreSQL-tsqueryä

Parsaattori tuottaa rakenteellisia tietoja, jotka muunnetaan PostgreSQLiin. to_tsquery koska me ' luomme rakenteellista syntaxia - emme websearch_to_tsquery koska olemme jo itse analysoineet operaattorit, joten meillä on enemmän valvontaa siitä, miten ehdot yhdistetään.

public string BuildTsQuery(ParsedQuery parsed)
{
    var queryParts = new List<string>();

    // Add include terms with AND
    foreach (var term in parsed.IncludeTerms)
    {
        queryParts.Add(term);
    }

    // Add wildcard terms with :* suffix
    foreach (var term in parsed.WildcardTerms)
    {
        queryParts.Add($"{term}:*");
    }

    return queryParts.Count > 0 ? string.Join(" & ", queryParts) : string.Empty;
}

Miksi ei vain käyttää websearch_to_tsquery? Koska se ei vieläkään toimi teknisellä tasolla, acronymit, ja domainM SK2erityinen syntax -ja ei tarjoa hakkeita hybridijärjestykseen tai fallbacks-lähestyksiinMska4 Analyysoimalla itseämmeMSC5 voimme käsitellä näitä etutapauksia ennen kuin ne saavuttavat PostgreSQLin

Parannettu rakennetutkimuskysymys

Euroopan unionin BuildSearchQuery menetelmä on kirjoitettu kokonaan uudelleen, jotta voitaisiin käyttää analysoitua kysymyksen rakennetta. baseQuery jo kielellä suoritettavat filtrit, päivämäärän ulottuvuus

private IOrderedQueryable<BlogPostEntity> BuildSearchQuery(
    string query,
    string language,
    DateTime? startDate,
    DateTime? endDate,
    string order)
{
    var parsed = _queryParser.Parse(query);
    IQueryable<BlogPostEntity> searchQuery = baseQuery;

    // Handle phrases (exact substring matching)
    foreach (var phrase in parsed.Phrases)
    {
        searchQuery = searchQuery.Where(x =>
            EF.Functions.ILike(x.Title, $"%{phrase}%")
            || EF.Functions.ILike(x.PlainTextContent, $"%{phrase}%")
            || x.Categories.Any(c => EF.Functions.ILike(c.Name, $"%{phrase}%")));
    }

    // Build tsquery for include terms and wildcards
    var tsQuery = _queryParser.BuildTsQuery(parsed);

    // Apply full-text search if we have terms
    if (!string.IsNullOrWhiteSpace(tsQuery))
    {
        searchQuery = searchQuery.Where(x =>
            x.SearchVector.Matches(EF.Functions.ToTsQuery("english", tsQuery))
            || x.Categories.Any(c =>
                EF.Functions.ToTsVector("english", c.Name)
                    .Matches(EF.Functions.ToTsQuery("english", tsQuery))));
    }

    // Handle acronyms with case-insensitive substring search
    // This supplements full-text search (additive OR), not replaces it
    var acronymTerms = parsed.IncludeTerms
        .Concat(parsed.WildcardTerms)
        .Where(t => _queryParser.IsAcronymLike(t))
        .ToList();

    foreach (var acronym in acronymTerms)
    {
        searchQuery = searchQuery.Where(x =>
            EF.Functions.ILike(x.Title, $"%{acronym}%")
            || EF.Functions.ILike(x.PlainTextContent, $"%{acronym}%"));
    }

    // Handle excluded terms (must NOT contain these)
    foreach (var excludeTerm in parsed.ExcludeTerms)
    {
        searchQuery = searchQuery.Where(x =>
            !EF.Functions.ILike(x.Title, $"%{excludeTerm}%")
            && !EF.Functions.ILike(x.PlainTextContent, $"%{excludeTerm}%")
            && !x.Categories.Any(c => EF.Functions.ILike(c.Name, $"%{excludeTerm}%")));
    }

    return orderedQuery;
}

hakuesimerkit

Tässä on joitakin esimerkkejä parannetusta hakutehokkuudesta:

Perushaku

DiSE

✅ Vastaa nyt artikloille, joiden otsikko tai sisältö on "DiSEM SK2

Tekniset ehdot

ASP.NET

✅ löytää artikkeleita ASP:staM SK1NET ( automaattisesti muunnettuna SSK3aspnet" täyttämään

Luettelo otsikoista

"semantic search"

✅ löytää artikloissa täsmällisen lauseen

Poikkeukselliset ehdot

ASP.NET -Core

✅ löydetään ASP-artikkeleja, mutta jätetään pois ne artiklat, joissa mainitaan

Wildcardit

ASP*

✅ Matches "ASPM SK2 "AspNET", "ASPNetCoreMSC6 jneMST7

Monimutkainen kysymys

"full text search" PostgreSQL -MySQL

✅ löytää artiklaa, jossa on täsmällinen sanamuoto "täydellinen tekstitutkimus" ja postgreSQLin mainitseminenM SK3, mutta lukuun ottamatta MySQL:tä mainitsevia artikloja

Esimerkki ennen ja sen jälkeen

Kysymys: ASP.NET and Alpine

Ennen (kaikki

  • "ASP.NET" Split into "ASP
  • " jaM SK1 poistettiin pysähdyssanaksi
  • Tuloksena: Vain hakuja M SK1Alpine"

Sen jälkeen (fixed

  • "ASP
  • " ja " säilytetään älykkäästi osana käyttäjäkysymyksen tarkoitusta
  • "AlpineM SK1 etsittiin normaalisti
  • Tuloksena: löydetään artikkeleita sekä ASP:staM SK1NETistä että Alpeista

RRF:n luokitusintegraatio

haku integroidaan vastavuoroisen luokan fuusioon (RRFM SK1 sellaisena kuin se on toteutettu aikaisempi semanttinen hakuartikkeli. RRF:tä käytetään luokitus, ei palaa mieleen - se yhdistää jo nyt-BM:stä saatuja tuloksiaM SK3 täydellinenMSC4tekstin haku ja vektorin semanttinen hakuMST5

// Fuse using RRF with category/freshness boosts
var fusedDtos = _ranker.FuseResults(bm25Results, vectorResults, query);

RRF-algoritmi käyttää 1/(k+rank) jossa k=60 yhdistää tulokset monista lähteistä M SK1 ja soveltaa lisäyksiä :

  • Luettelokilpailu: +2.0
  • Luettelo otsikoista: +1.0
  • Värvys: Exponentiaalinen heikkeneminen vuoden aikana

Lisätietoja RRF:n täytäntöönpanosta ja hybriditutkimuksen toiminnasta, Semanttinen haku toiminnassa. syvempien syvennysten ja vektorin samankaltaisuuksien selvittämiseksi "Lawyer GPTM SK1 - Osa SSK3. Sama infrastruktuuri mahdollistaa sekä käyttäjän että RAG-tarkastamisen.

Tekninen arkkitehtuuri

Riippuvuusmyrkytys

Uudet komponentit on rekisteröity palveluiksi:

services.AddSingleton<SearchQueryParser>();
services.AddSingleton<SearchRanker>();
services.AddScoped<BlogSearchService>();

SearchQueryParser ja SearchRanker ovat yksitonisia, koska ne' ovat valtiottomiaM SK1 teräs -varmat, ja niitä voidaan käyttää uudelleen kaikkialla BlogSearchService on laajennettu, koska se liittyy tietokannan kontekstiin.

Kysymysvirta

  1. Käyttäjä esittää hakukysymyksen → hakujohto
  2. Kysymyksen parsiminen → SearchQueryParser jakautuu rakenteellisiin komponentteihin
  3. Semanttinen haku ( jos se on aktivoitu) → Qdrant vector database with ONNX embeddings
  4. PostgreSQL full-tekstin haku (kaikki saatavillaM SK2 → BMM SK1pohjainen avainsanojen vastaavuus
  5. RRF:n fuusio → Yhdistää molemmat tuloskokonaisuudet kategoriaanM SK1freshness boosts
  6. Ei tuloksia → Palauttaa viimeaikaiset työpaikat ehdotuksina

Samaa semanttista hakukomponenttia käytetään myös Oikeusasiamies GPT järjestelmä, jonka avulla voidaan hakea asiaankuuluvia AI:n aikaisempia blog postsia Osa 4 lisätietoja juomaputkesta.

Tietokantajärjestelmä

haku perustuu ennakkoarvioon SearchVector pilari BlogPosts taulukko:

ALTER TABLE mostlylucid."BlogPosts"
ADD COLUMN "SearchVector" tsvector
GENERATED ALWAYS AS (
    to_tsvector('english',
        coalesce("Title", '') || ' ' ||
        coalesce("PlainTextContent", '')
    )
) STORED;

CREATE INDEX idx_blog_posts_search_vector
ON mostlylucid."BlogPosts"
USING GIN ("SearchVector");

GIN (Yleinen käännetyn indeksin indexi) tarjoaa nopean täytäntöönpanoon perustuvan -tekstin etsinnän laajassa tekstissä

Toimivuusnäkökohdat

Miksi Acronymsille ILIKE?

Kun ILIKE (caseM SK1insensitive LIKE

  1. Täsmällinen-tekstin haku normalisoidaan /perusteita koskevia termejäM SK2 lyhyen uppercase-stringin murtaminen
  2. Acronymit ovat yleensä lyhyitä (≤6-heikkouksiaM SK1, jotka rajoittavat suoritusvaikutusta
  3. Vaatimusta lisätään vain tarpeen vaatiessa (jäljitetyt acronymitM SK1

Tämä lähestymistapa ei muuttuisi mielivaltaiseen alastringin hakuun miljoonien rivien välillä -, mutta kohdennettujen acronymien fallback-tarkoituksiin se's appropriateM SK2

PostgreSQLin kattodensiteettirajoitus (ts_rank_cd)

PostgreSQL tarjoaa kaksi luokitustehtävää täysmääräiseen-tekstin etsintäänM SK1

  • ts_rank: Perustermien taajuus
  • ts_rank_cd: Kattodensiteettien luokitus (kuten läheiset ehdot näyttävät yhdessä

Me käytämme ts_rank_cd koska se tarjoaa BM25- vastaava merkitys ottamalla huomioon tähtäimen läheisyys

// Order by cover density ranking - rewards term proximity
orderedQuery = searchQuery.OrderByDescending(x =>
    x.SearchVector.RankCoverDensity(EF.Functions.ToTsQuery("english", tsQuery)));

Miksi? ts_rank_cd on parempi:

Metriki ts_rank ts_rank_cd
Algoritmi Lyhyen aikavälin taajuus
Useat-sanakysymykset laskee ehtoja erikseen Palkintojen ehtojen esiintyminen yhdessä
Esimerkki: M SK1kolikoiden kontit" Tekijä, jolla on "kotteritM SK2 SSK3 prosenttiosuudet ovat korkeat Tekiijä, jossa on "koterissa olevat kontit SSK6 yhdessä tulostaso on korkeampi S
Toimivuus Nopeutettu Poikkeuksellisen hitaampi , edelleen alijäämä GIN-indeksille M
Elintavat Yksinkertainen laskeminen Lyhyesti BM

Tämä on nopeiden voittojen optimointi - parempi relevanssi-Ranking nollakäytännön kanssa -tasolaskentaM SK2 Kaikkien järjestelmien luominen tapahtuu PostgreSQLissa käyttämällä olemassa olevaa GIN-indeksiä SearchVector.

Viittaukset:

Lisää suorituskyvyn optimointia

Tutkimuksen toiminnallisuuden korjaamisen lisäksi monet avainoptimointitoimet parantavat suorituskykyä:

1. Kielten säilyttäminen

Käytettävissä olevat kielet muuttuvat harvoin, mutta ne kysyttiin jokaisessa hakupyyntössä.. Nyt kaksoiscachoitu.

private static readonly TimeSpan LanguageCacheDuration = TimeSpan.FromHours(1);
private static List<string>? _cachedLanguages;
private static DateTime _languageCacheExpiry = DateTime.MinValue;
private static readonly SemaphoreSlim _cacheLock = new(1, 1);

Vaikutus: Poistaa 1 tietokannan kysymyksen kutakin hakupyyntöä kohden

2. Batched ILIKE-kysymykset

Alkuperäinen koodi foreach loopit, jotka luovat useita WHERE-lausekkeita. Nyt koottu yhteen ainoaan ilmaisuun:

// BEFORE: Multiple WHERE clauses
foreach (var acronym in acronymTerms)
{
    searchQuery = searchQuery.Where(x =>
        EF.Functions.ILike(x.Title, $"%{acronym}%"));
}

// AFTER: Single batched WHERE
if (acronymTerms.Count > 0)
{
    searchQuery = searchQuery.Where(x =>
        acronymTerms.Any(acronym =>
            EF.Functions.ILike(x.Title, $"%{acronym}%")));
}

Vaikutus: puhtaampi SQL, ~5-10% nopeampi monenvälisissä kysymyksissä

3. Yleisten kysymysten kattamisindeksi

Lisättiin osittainen indeksi INCLUDE-columnin kanssa, joka koskee usein saatavilla olevia menetelmiä:

CREATE INDEX idx_blog_posts_search_covering
ON mostlylucid."BlogPosts" ("LanguageId", "IsHidden", "ScheduledPublishDate")
INCLUDE ("Id", "Slug", "Title", "PublishedDate")
WHERE "IsHidden" = false;

Vaikutus: mahdollistaa index-onnilliset skannaukset - PostgreSQL:ssa ei ole tarpeen käyttää taulukkohauppaa, eikä ' tarvitse ottaa käyttöön taulukoita.

4. Poistettu tarpeeton sisältää

EF Core's Include() loads full navigation entities. Poistettu, jos vain ns. navigointiin liittyvät tekijät on käytetty KDE-lausekkeissa

// BEFORE: Loads full LanguageEntity into memory
.Include(x => x.LanguageEntity)
.Where(x => x.LanguageEntity.Name == "en")

// AFTER: EF translates navigation property without loading entity
.Where(x => x.LanguageEntity.Name == "en")

Vaikutus: ~5-10% muistin vähentäminenM SK2 vähemmän tietoja, jotka siirretään tietokannasta

Viittaukset:

Kysymyksen optimointistrategia

etsintä rakentaa, Missä lausekkeita käytetään vähitellen EF Core's ilmaisupuu koostumus:

IQueryable<BlogPostEntity> searchQuery = baseQuery;

// Each filter added conditionally - PostgreSQL optimizes the final query
if (parsed.Phrases.Count > 0) { searchQuery = searchQuery.Where(...); }
if (!string.IsNullOrWhiteSpace(tsQuery)) { searchQuery = searchQuery.Where(...); }
if (acronymTerms.Count > 0) { searchQuery = searchQuery.Where(...); }

Tämä tuottaa yksi optimoitu SQL-kysymys useiden ympäriajojen sijasta. PostgreSQLin kyselysuunnitelman käyttäjä voi käyttää tilastoja ja indeksejä tehokkaasti, kun se katsoo täydellisen MERE-lausekkeen

Tulosten yhteenveto

Kaikkien optimointien kumulatiivinen vaikutus:

Optimointi Latenssivaikutus DB-laadun vaikutukset S
Kielten tallentamisjärjestelmä vähimmäismäärä SSK2 -1 kysymys
Poistaa IncludeM SK1 3 4 Vähemmän tiedonsiirtoa
Batch ILIKE -5-10% ♫ ♫ Cleaner SQL ♫
Katkaiseva indeksi SSK1 -20-30% Indexi SSK4 Vain skansointi
tsM SK1rank_cd Samankaltainen SSK4 Parempi merkitys
Cache fix (route params) NM SK4A M Poistaa vanhentuneet tiedot

Kaiken kaikkiaan odotettu parannus: 30-50% nopeampi haku tietokannan kuormitusta vähennetään merkittävästi.

Opittiin

  1. Don't assume full-tekstin haku käsittää kaiken: Akronymien ja erityispiirteiden kaltaiset raja-asiat tarvitsevat erityistä käsittelyä

  2. Yhdistetään useat lähestymistavat: TäsmällinenM SK1tekstin haku (BM25) + semanttinen haku | (vectorit \ ) \ + \substring fallbacks tarjoaa paremman kattamisen kuin mikään yksittäinen menetelmä

  3. Googlen luomat käyttäjän odotukset: Mainitujen lausekkeiden tukeminen

  4. Mahdollistetaan hyödylliset puutteet: Kun haku epäonnistuuM SK1 en' ei näy mitään - kuvaa äskettäin lähetettyjä posteja ja selventää, että mitään yhdistelmää ei löydetty

  5. Parse, donM SK1t hack: Asianmukainen kysymyksen parsaattori on puhtaampi ja paremmin ylläpidettävä kuin joukko string-manipulaatioita

  6. PostgreSQL:n käyttömahdollisuus: käyttö ts_rank_cd sen sijaan, että ts_rank BM:n osalta

  7. Profili ennen optimointia: " ilmeiset" pullonkaulat ( FTS-analyysin parsiminenM SK4 eivät olleet todellista ongelmaaMSL5 MSL6 Kielten hakutMSR7 liiallinen mukaan lukienMST8 ja puuttuvat indeksit olivat odotettua suuremmat vaikutukset

  8. Tappitietokannan toiminnot: Usein foreach loops creating separate WHERE clauses generate suboptimal SQL. Use Any() tai All() liitetään yhteen ainoaan ilmaisuun.

Tulevat parannukset

Mahdolliset parannukset tulevaisuutta varten

Takaamista koskevat parannukset:

  • Hävyinen vastaavuus: Levenshteinin pituus typotoleranssille
  • Synonymi laajentuminen: "blog post

Parsointiin liittyvät parannukset:

  • Luokitusfiltrointi: category:ASP.NET operaattori
  • Aikaväli: after:2025-01-01 operaattori

Luokittelun tarkistukset:

  • Tuloksen korostaminen: Näyttää tulosten mukaiset tekstiosat
  • Klikkää-seurantaa läpi: Opi käyttäjäkäyttäytymisestä paremman luokituksen aikaansaamiseksi

Näkyvyys:

  • hakuanalyysi: Seuraa suosittuja kysymyksiä ja epäonnistuneita hakuja puutteiden tunnistamiseksi

Päätelmät

Rakennustuotanto-laadun haku edellyttää äärien korjaamista ja suorituskyvyn parantaminen. Tässä artiklassa käsitellään sekä : PostgreSQLin täytäntöönpanon korjaamista että - tekstihuomautuksia. ts_rank_cd).

täytäntöönpanossa saavutetaan 30-50% nopeampi haku vähentämällä tietokannantaa through:

  • Kattodensiteettitaulukko (ts_rank_cd) asianmukaisuuden parantamiseksi
  • Kielten tallentamisjärjestelmä poistaa toistuvat kysymykset
  • Batched ILIKE-ilmaukset puhtaammalle SQL:lle
  • Sellaisten indeksien katkaiseminen, jotka mahdollistavat indeksin-onnilliset skannaukset
  • Poistettu tarpeeton EF Core sisältää

Keskeinen näkemys: yksi ainoa lähestymistapa ei käsitellä kaikkia tapauksia. PostgreSQL FTS on erinomainen avainsanojen yhteensovittamisessaM SK2 semanttiset hakut käsittävät käsitteelliset kysymykset , ja kohdennetut virheet kiinnittävät etätapauksetMSC4 puhdas parsointilaaja yhdistää ne toisiinsa–, käsitellään operaattoreita ja teknisiä termejä ennen kuin ne pääsevät hakukoneisiin–.

Semanttinen hakuinfrastruktuuri palvelee kahta tarkoitusta:

  • käyttäjä-suuntautunut haku: Yhdistää avainsanoja ja semanttisia vastauksia parempien tulosten saamiseksi
  • RAG:n jäljittäminen: Oikeusasiamies GPT kirjallinen avustaja

Aiheita koskevat artiklat:

Virallinen asiakirja:

Kaikki saatavilla olevat koodit blog's GitHub-tietokanta.

Finding related posts...
logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.