Rechercher dans plusieurs colonnes dans des index de recherche
Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
Les index de recherche peuvent indexer plusieurs colonnes tokenisées, ce qui rend les requêtes sur ces colonnes plus efficaces. Cette page explique comment effectuer une recherche sur plusieurs colonnes, ce qui est un type de recherche en texte intégral.
Effectuer une recherche multicolonne
La structure de l'index de recherche garantit que les requêtes n'ont pas besoin d'une jointure distribuée, ce qui garantit des performances prévisibles des requêtes. La jointure distribuée est évitée en raison de la colocalisation de tous les jetons correspondant à une ligne de table de base sur la même division.
Spanner est compatible avec les requêtes de recherche multicolonne dans les opérateurs de conjonction, de disjonction et de négation de la clause WHERE. Vous pouvez utiliser tous les types de requêtes suivants avec un indice de recherche:
Conjonction: recherchez les documents dans lesquels Title contient le terme "voiture" et Studio le terme "soleil".
Les deux formats filtrent les documents où Title est NULL. Les fonctions de tokenisation et de recherche sont définies pour renvoyer NULL en entrée NULL. SQL définit NOT NULL comme NULL.
En outre, vous pouvez faire référence à la même colonne TOKENLIST plusieurs fois.
Utilisez le langage rquery ou SQL pour rechercher plusieurs termes dans la même colonne. Nous vous recommandons d'utiliser rquery en raison de son mise en cache efficace des requêtes pour les requêtes paramétrées. Outre le meilleur taux de réussite du cache de requêtes, les langages rquery et SQL ont les mêmes taux de latence et de performances.
GoogleSQL
SELECTAlbumIdFROMAlbumsWHERESEARCH(Title_Tokens,'car OR guy')SELECTAlbumIdFROMAlbumsWHERESEARCH(Title_Tokens,'car')ORSEARCH(Title_Tokens,'guy')
PostgreSQL
SELECTalbumidFROMalbumsWHEREspanner.search(title_tokens,'car OR guy')SELECTalbumidFROMalbumsWHEREspanner.search(title_tokens,'car')ORspanner.search(title_tokens,'guy')
Vous pouvez également utiliser des conditions non textuelles accélérées avec des index de recherche dans la même requête avec des fonctions de recherche en texte intégral.
Sauf indication contraire, le contenu de cette page est régi par une licence Creative Commons Attribution 4.0, et les échantillons de code sont régis par une licence Apache 2.0. Pour en savoir plus, consultez les Règles du site Google Developers. Java est une marque déposée d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/09/09 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Difficile à comprendre","hardToUnderstand","thumb-down"],["Informations ou exemple de code incorrects","incorrectInformationOrSampleCode","thumb-down"],["Il n'y a pas l'information/les exemples dont j'ai besoin","missingTheInformationSamplesINeed","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 2025/09/09 (UTC)."],[],[],null,["# Search multiple columns in search indexes\n\n| **Note:** This feature is available with the Spanner Enterprise edition and Enterprise Plus edition. For more information, see the [Spanner editions overview](/spanner/docs/editions-overview).\n\n\u003cbr /\u003e\n\n[Search indexes](/spanner/docs/full-text-search/search-indexes) can index\nmultiple tokenized columns, making queries on these columns more efficient. This\npage describes how to perform a search on multiple columns, which is a type of\n[full-text search](/spanner/docs/full-text-search).\n\nPerform a multi-column search\n-----------------------------\n\nThe [structure of the search\nindex](/spanner/docs/full-text-search/search-indexes#search-indexes)\nensures that queries don't need a distributed join, ensuring predictable\nperformance of the queries. The distributed join is avoided due to the\ncolocation of all tokens that correspond to a base table row on the same split.\n\nFor example, consider the following schema: \n\n### GoogleSQL\n\n CREATE TABLE Albums (\n AlbumId STRING(MAX) NOT NULL,\n Title STRING(MAX),\n Studio STRING(MAX),\n Title_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Title)) HIDDEN,\n Studio_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(Studio)) HIDDEN\n ) PRIMARY KEY(AlbumId);\n\n CREATE SEARCH INDEX AlbumsIndex ON Albums(Title_Tokens, Studio_Tokens);\n\n### PostgreSQL\n\n CREATE TABLE albums (\n albumid character varying NOT NULL,\n title character varying,\n studio character varying,\n title_tokens spanner.tokenlist\n GENERATED ALWAYS AS (TOKENIZE_FULLTEXT(title)) VIRTUAL HIDDEN,\n studio_tokens spanner.tokenlist\n GENERATED ALWAYS AS (TOKENIZE_FULLTEXT(studio)) VIRTUAL HIDDEN,\n ) PRIMARY KEY(albumid);\n\n CREATE SEARCH INDEX albumsindex ON albums(title_tokens, studio_tokens);\n\nA query can now search two fields: `Title_Tokens` and `Studio_Tokens`. \n\n### GoogleSQL\n\n SELECT AlbumId\n FROM Albums\n WHERE SEARCH(Title_Tokens, \"fifth symphony\")\n AND SEARCH(Studio_Tokens, \"Blue Note Studio\")\n\n### PostgreSQL\n\n SELECT albumid\n FROM albums\n WHERE spanner.search(title_tokens, 'fifth symphony')\n AND spanner.search(studio_tokens, 'Blue Note Studio')\n\nSpanner supports multi-column search queries in conjunction,\ndisjunction, and negation operators in the `WHERE` clause. You can use all of\nthe following types of queries with a search index:\n\n- **Conjunction** : Find documents where `Title` has the term \"car\" and\n `Studio` has the term \"sun\".\n\n ### GoogleSQL\n\n SELECT AlbumId\n FROM Albums\n WHERE SEARCH(Title_Tokens, 'car') AND SEARCH(Studio_Tokens, 'sun')\n\n ### PostgreSQL\n\n SELECT albumid\n FROM albums\n WHERE spanner.search(title_tokens, 'car') AND spanner.search(studio_tokens, 'sun')\n\n- **Disjunction** : Find documents where either `Title` has the term \"car\" or\n `Studio` has the term \"sun\"\n\n ### GoogleSQL\n\n SELECT AlbumId\n FROM Albums\n WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun')\n\n ### PostgreSQL\n\n SELECT albumid\n FROM albums\n WHERE spanner.search(title_tokens, 'car') OR spanner.search(studio_tokens, 'sun')\n\n- **Negation** : Find all documents where `Title` doesn't contain the term\n \"car\".\n\n ### GoogleSQL\n\n SELECT AlbumId\n FROM Albums\n WHERE NOT SEARCH(Title_Tokens, 'car')\n\n ### PostgreSQL\n\n SELECT albumid\n FROM albums\n WHERE NOT spanner.search(title_tokens, 'car')\n\n The [rquery language](/spanner/docs/full-text-search/query-overview#rquery)\n can perform the same type of searches: \n\n ### GoogleSQL\n\n SELECT AlbumId\n FROM Albums\n WHERE SEARCH(Title_Tokens, '-car')\n\n ### PostgreSQL\n\n SELECT albumid\n FROM albums\n WHERE spanner.search(title_tokens, '-car')\n\n Both forms filter documents where `Title` is NULL. Tokenization and\n search functions are defined to return NULL on NULL input. SQL defines NOT\n NULL as NULL.\n\nAdditionally, you can reference the same `TOKENLIST` column multiple times. \n\n### GoogleSQL\n\n SELECT AlbumId\n FROM Albums\n WHERE (SEARCH(Title_Tokens, 'car') OR SEARCH(Studio_Tokens, 'sun'))\n AND (SEARCH(Title_Tokens, 'guy') OR SEARCH(Studio_Tokens, electric))\n\n### PostgreSQL\n\n SELECT albumid\n FROM albums\n WHERE (spanner.search(title_tokens, 'car') OR spanner.search(studio_tokens, 'sun'))\n AND (spanner.search(title_tokens, 'guy') OR spanner.search(studio_tokens, 'electric'))\n\nUse either the [rquery language](/spanner/docs/full-text-search/query-overview#rquery)\nor SQL to search for multiple terms in the same column. rquery is recommended\ndue to its efficient query [caching](/spanner/docs/whitepapers/life-of-query#caching)\nfor parameterized queries. Aside from the better query cache hit rate, the\nrquery and SQL languages have the same latency and performance rates. \n\n### GoogleSQL\n\n SELECT AlbumId\n FROM Albums\n WHERE SEARCH(Title_Tokens, 'car OR guy')\n\n SELECT AlbumId\n FROM Albums\n WHERE SEARCH(Title_Tokens, 'car') OR SEARCH(Title_Tokens, 'guy')\n\n### PostgreSQL\n\n SELECT albumid\n FROM albums\n WHERE spanner.search(title_tokens, 'car OR guy')\n\n SELECT albumid\n FROM albums\n WHERE spanner.search(title_tokens, 'car') OR spanner.search(title_tokens, 'guy')\n\nYou can also use non-text conditions accelerated with search indexes in the same\nquery with full-text search functions.\n\nWhat's next\n-----------\n\n- Learn about [full-text search queries](/spanner/docs/full-text-search/query-overview).\n- Learn how to [rank search results](/spanner/docs/full-text-search/ranked-search).\n- Learn how to [perform a substring search](/spanner/docs/full-text-search/substring-search).\n- Learn how to [paginate search results](/spanner/docs/full-text-search/paginate-search-results).\n- Learn how to [mix full-text and non-text queries](/spanner/docs/full-text-search/mix-full-text-and-non-text-queries)."]]