sql >> Databasteknik >  >> RDS >> PostgreSQL

Fungerar frasen sökoperator <-> med JSONB-dokument eller endast relationstabeller?

Funktionen för frassökning är integrerad i textsökningsdata typ tsquery . textsökoperatorn @@ du visar tar en tsvector till vänster och en tsquery till höger. Och en tsvector kan byggas från vilken teckentyp som helst och från ett JSON-dokument.

Relaterat:

Du kan konvertera din json eller jsonb dokument till en textsökningsvektor med en av de dedikerade funktioner :

to_tsvector()
json(b)_to_tsvector()

Observera att dessa endast inkluderar värden från JSON-dokumentet, inte nycklar . Vanligtvis är det vad du vill ha. Grundläggande exempel:

SELECT to_tsvector(jsonb '{"foo":"jump quickly"}')
    @@ to_tsquery('jump <-> quick:*');

Demonstrerar prefixmatchning ovanpå frassökning medan du håller på. Se:

Alternativt , kan du helt enkelt skapa tsvector från text representation av ditt JSON-dokument för att även inkludera nyckelnamn:

SELECT to_tsvector((jsonb '{"foo-fighter":"jump quickly"}')::text)
    @@ to_tsquery('foo <-> fight:*');

Producerar en större tsvector , uppenbarligen.

Båda kan indexeras (vilket är huvudpunkten med textsökning). Endast index är bundna till relationstabeller. (Och du kan indexera uttrycket !)
Själva uttrycket kan appliceras på vilket värde som helst, inte bundet till tabeller som du verkar antyda.




  1. Genomsnittlig radlängd högre än möjligt

  2. Bilder visas på alla utom 1 kolvsida

  3. generera_series() motsvarande i MySQL

  4. mysql-frågan returnerar ibland ingenting