{"title":"Recherche plein texte","version":"2.0","locale":"fr","docname":"ref/contrib/postgres/search","url":"/fr/2.0/ref/contrib/postgres/search/","canonical":"https://djangodocs.dev/fr/2.0/ref/contrib/postgres/search/","summary":"Les fonctions de base de données dans le module django.contrib.postgres.search facilitent l’utilisation du moteur de recherche plein texte de PostgreSQL. Pour les…","html":"<h1>Recherche plein texte<a class=\"heading-anchor\" href=\"#full-text-search\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Les fonctions de base de données dans le module <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.postgres.search</span></code> facilitent l’utilisation du <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/static/textsearch.html\">moteur de recherche plein texte</a> de PostgreSQL.</p>\n<p>Pour les exemples de ce document, nous utiliserons les modèles définis dans <a class=\"reference internal\" href=\"/fr/2.0/topics/db/queries/\"><span class=\"doc\">Création de requêtes</span></a>.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Voir aussi</p>\n<p>Pour un aperçu de haut niveau de la recherche, consultez la <a class=\"reference internal\" href=\"/fr/2.0/topics/db/search/\"><span class=\"doc\">documentation thématique</span></a>.</p>\n</aside>\n<section id=\"the-search-lookup\">\n<h2>L’expression de recherche <code class=\"docutils literal notranslate\"><span class=\"pre\">search</span></code><a class=\"heading-anchor\" href=\"#the-search-lookup\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p id=\"std-fieldlookup-search\">La façon la plus simple d’utiliser la recherche plein texte est de rechercher un seul terme dans une seule colonne de base de données. Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">body_text__search</span><span class=\"o\">=</span><span class=\"s1\">&#39;Cheese&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[&lt;Entry: Cheese on Toast recipes&gt;, &lt;Entry: Pizza Recipes&gt;]</span>\n</code></pre></div>\n<p>Ceci crée un vecteur <code class=\"docutils literal notranslate\"><span class=\"pre\">to_tsvector</span></code> dans la base de données à partir du champ <code class=\"docutils literal notranslate\"><span class=\"pre\">body_text</span></code> et une requête <code class=\"docutils literal notranslate\"><span class=\"pre\">plainto_tsquery</span></code> à partir du terme de recherche <code class=\"docutils literal notranslate\"><span class=\"pre\">'Cheese'</span></code>, les deux utilisant la configuration de recherche par défaut de la base de données. Les résultats sont obtenus en faisant correspondre la requête et le vecteur.</p>\n<p>Pour utiliser l’expression de recherche <code class=\"docutils literal notranslate\"><span class=\"pre\">search</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.postgres'</span></code> doit figurer dans le réglage <a class=\"reference internal\" href=\"/fr/2.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>.</p>\n</section>\n<section id=\"searchvector\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">SearchVector</span></code><a class=\"heading-anchor\" href=\"#searchvector\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.search.SearchVector\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">SearchVector</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">\\*expressions</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">config=None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">weight=None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.search.SearchVector\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>La recherche dans un champ unique fonctionne bien mais est plutôt limitée. Les instances <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry</span></code> que nous recherchons appartiennent à un <code class=\"docutils literal notranslate\"><span class=\"pre\">Blog</span></code>, qui possède un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">tagline</span></code>. Pour interroger les deux champs, utilisez un vecteur <code class=\"docutils literal notranslate\"><span class=\"pre\">SearchVector</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.postgres.search</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SearchVector</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">search</span><span class=\"o\">=</span><span class=\"n\">SearchVector</span><span class=\"p\">(</span><span class=\"s1\">&#39;body_text&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;blog__tagline&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">search</span><span class=\"o\">=</span><span class=\"s1\">&#39;Cheese&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[&lt;Entry: Cheese on Toast recipes&gt;, &lt;Entry: Pizza Recipes&gt;]</span>\n</code></pre></div>\n<p>Les paramètres à <code class=\"docutils literal notranslate\"><span class=\"pre\">SearchVector</span></code> peuvent être n’importe quelle <a class=\"reference internal\" href=\"/fr/2.0/ref/models/expressions/#django.db.models.Expression\" title=\"django.db.models.Expression\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Expression</span></code></a> ou le nom d’un champ. Plusieurs paramètres seront concaténés par des espaces afin que le document de recherche les inclue tous.</p>\n<p>Les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">SearchVector</span></code> peuvent être combinés ce qui permet de les réutiliser. Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">search</span><span class=\"o\">=</span><span class=\"n\">SearchVector</span><span class=\"p\">(</span><span class=\"s1\">&#39;body_text&#39;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">SearchVector</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog__tagline&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">search</span><span class=\"o\">=</span><span class=\"s1\">&#39;Cheese&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[&lt;Entry: Cheese on Toast recipes&gt;, &lt;Entry: Pizza Recipes&gt;]</span>\n</code></pre></div>\n<p>Voir <a class=\"reference internal\" href=\"#postgresql-fts-search-configuration\"><span class=\"std std-ref\">Modification de la configuration de recherche</span></a> et <a class=\"reference internal\" href=\"#postgresql-fts-weighting-queries\"><span class=\"std std-ref\">Pondération des requêtes</span></a> pour une explication des paramètres <code class=\"docutils literal notranslate\"><span class=\"pre\">config</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">weight</span></code>.</p>\n</section>\n<section id=\"searchquery\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">SearchQuery</span></code><a class=\"heading-anchor\" href=\"#searchquery\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.search.SearchQuery\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">SearchQuery</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">value</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">config</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.search.SearchQuery\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">SearchQuery</span></code> traduit les termes fournis par l’utilisateur en un objet requête de recherche que la base de données va comparer à un vecteur de recherche. Par défaut, tous les mots fournis par l’utilisateur sont passés par un algorithme de segmentation, puis la recherche de correspondance s’effectue pour tous les termes résultants.</p>\n<p>Les termes <code class=\"docutils literal notranslate\"><span class=\"pre\">SearchQuery</span></code> peuvent être combinés logiquement pour fournir plus de souplesse :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.postgres.search</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SearchQuery</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">SearchQuery</span><span class=\"p\">(</span><span class=\"s1\">&#39;meat&#39;</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> <span class=\"n\">SearchQuery</span><span class=\"p\">(</span><span class=\"s1\">&#39;cheese&#39;</span><span class=\"p\">)</span>  <span class=\"c1\"># AND</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">SearchQuery</span><span class=\"p\">(</span><span class=\"s1\">&#39;meat&#39;</span><span class=\"p\">)</span> <span class=\"o\">|</span> <span class=\"n\">SearchQuery</span><span class=\"p\">(</span><span class=\"s1\">&#39;cheese&#39;</span><span class=\"p\">)</span>  <span class=\"c1\"># OR</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"o\">~</span><span class=\"n\">SearchQuery</span><span class=\"p\">(</span><span class=\"s1\">&#39;meat&#39;</span><span class=\"p\">)</span>  <span class=\"c1\"># NOT</span>\n</code></pre></div>\n<p>Voir <a class=\"reference internal\" href=\"#postgresql-fts-search-configuration\"><span class=\"std std-ref\">Modification de la configuration de recherche</span></a> pour une explication du paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">config</span></code>.</p>\n</section>\n<section id=\"searchrank\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">SearchRank</span></code><a class=\"heading-anchor\" href=\"#searchrank\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.search.SearchRank\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">SearchRank</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">vector</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">query</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">weights</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.search.SearchRank\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Nous n’avons jusqu’ici que renvoyés les résultats pour lesquels au moins une correspondance entre le vecteur et la requête est possible. Il est probable que vous souhaitiez trier les résultats par une certaine notion de pertinence. PostgreSQL fournit une fonction de classement qui prend en compte la fréquence d’apparition des termes recherchés dans le document, la proximité de ces termes dans le document et l’importance de l’endroit où les termes se trouvent dans le document. Plus la correspondance est bonne, plus le classement sera élevé. Pour trier par pertinence :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.postgres.search</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SearchQuery</span><span class=\"p\">,</span> <span class=\"n\">SearchRank</span><span class=\"p\">,</span> <span class=\"n\">SearchVector</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">vector</span> <span class=\"o\">=</span> <span class=\"n\">SearchVector</span><span class=\"p\">(</span><span class=\"s1\">&#39;body_text&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">query</span> <span class=\"o\">=</span> <span class=\"n\">SearchQuery</span><span class=\"p\">(</span><span class=\"s1\">&#39;cheese&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">rank</span><span class=\"o\">=</span><span class=\"n\">SearchRank</span><span class=\"p\">(</span><span class=\"n\">vector</span><span class=\"p\">,</span> <span class=\"n\">query</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;-rank&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[&lt;Entry: Cheese on Toast recipes&gt;, &lt;Entry: Pizza recipes&gt;]</span>\n</code></pre></div>\n<p>Voir <a class=\"reference internal\" href=\"#postgresql-fts-weighting-queries\"><span class=\"std std-ref\">Pondération des requêtes</span></a> pour une explication du paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">weights</span></code>.</p>\n</section>\n<section id=\"changing-the-search-configuration\">\n<span id=\"postgresql-fts-search-configuration\"></span><h2>Modification de la configuration de recherche<a class=\"heading-anchor\" href=\"#changing-the-search-configuration\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Il est possible de préciser l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">config</span></code> de <a class=\"reference internal\" href=\"#django.contrib.postgres.search.SearchVector\" title=\"django.contrib.postgres.search.SearchVector\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SearchVector</span></code></a> et de <a class=\"reference internal\" href=\"#django.contrib.postgres.search.SearchQuery\" title=\"django.contrib.postgres.search.SearchQuery\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SearchQuery</span></code></a> afin d’utiliser une configuration de recherche différente. Cela permet d’utiliser des analyseurs et des dictionnaires de langue différents tels que définis par la base de données :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.postgres.search</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SearchQuery</span><span class=\"p\">,</span> <span class=\"n\">SearchVector</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">search</span><span class=\"o\">=</span><span class=\"n\">SearchVector</span><span class=\"p\">(</span><span class=\"s1\">&#39;body_text&#39;</span><span class=\"p\">,</span> <span class=\"n\">config</span><span class=\"o\">=</span><span class=\"s1\">&#39;french&#39;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">search</span><span class=\"o\">=</span><span class=\"n\">SearchQuery</span><span class=\"p\">(</span><span class=\"s1\">&#39;œuf&#39;</span><span class=\"p\">,</span> <span class=\"n\">config</span><span class=\"o\">=</span><span class=\"s1\">&#39;french&#39;</span><span class=\"p\">))</span>\n<span class=\"go\">[&lt;Entry: Pain perdu&gt;]</span>\n</code></pre></div>\n<p>La valeur de <code class=\"docutils literal notranslate\"><span class=\"pre\">config</span></code> peut aussi être stockée dans une autre colonne :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">F</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">search</span><span class=\"o\">=</span><span class=\"n\">SearchVector</span><span class=\"p\">(</span><span class=\"s1\">&#39;body_text&#39;</span><span class=\"p\">,</span> <span class=\"n\">config</span><span class=\"o\">=</span><span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog__language&#39;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">search</span><span class=\"o\">=</span><span class=\"n\">SearchQuery</span><span class=\"p\">(</span><span class=\"s1\">&#39;œuf&#39;</span><span class=\"p\">,</span> <span class=\"n\">config</span><span class=\"o\">=</span><span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog__language&#39;</span><span class=\"p\">)))</span>\n<span class=\"go\">[&lt;Entry: Pain perdu&gt;]</span>\n</code></pre></div>\n</section>\n<section id=\"weighting-queries\">\n<span id=\"postgresql-fts-weighting-queries\"></span><h2>Pondération des requêtes<a class=\"heading-anchor\" href=\"#weighting-queries\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Les différents champs d’une requête n’ont pas toujours la même pertinence, il est donc possible de pondérer les différents vecteurs avant de les combiner :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.postgres.search</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">SearchQuery</span><span class=\"p\">,</span> <span class=\"n\">SearchRank</span><span class=\"p\">,</span> <span class=\"n\">SearchVector</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">vector</span> <span class=\"o\">=</span> <span class=\"n\">SearchVector</span><span class=\"p\">(</span><span class=\"s1\">&#39;body_text&#39;</span><span class=\"p\">,</span> <span class=\"n\">weight</span><span class=\"o\">=</span><span class=\"s1\">&#39;A&#39;</span><span class=\"p\">)</span> <span class=\"o\">+</span> <span class=\"n\">SearchVector</span><span class=\"p\">(</span><span class=\"s1\">&#39;blog__tagline&#39;</span><span class=\"p\">,</span> <span class=\"n\">weight</span><span class=\"o\">=</span><span class=\"s1\">&#39;B&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">query</span> <span class=\"o\">=</span> <span class=\"n\">SearchQuery</span><span class=\"p\">(</span><span class=\"s1\">&#39;cheese&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">rank</span><span class=\"o\">=</span><span class=\"n\">SearchRank</span><span class=\"p\">(</span><span class=\"n\">vector</span><span class=\"p\">,</span> <span class=\"n\">query</span><span class=\"p\">))</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">rank__gte</span><span class=\"o\">=</span><span class=\"mf\">0.3</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;rank&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Le poids devrait correspondre à l’une des lettres suivantes : D, C, B, A. Par défaut, ces poids font référence respectivement aux nombres  <code class=\"docutils literal notranslate\"><span class=\"pre\">0,1</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">0,2</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">0,4</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">1,0</span></code>. Si vous souhaitez pondérer de manière différente, passez une liste de quatre nombres flottants à <a class=\"reference internal\" href=\"#django.contrib.postgres.search.SearchRank\" title=\"django.contrib.postgres.search.SearchRank\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SearchRank</span></code></a> pour le paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">weights</span></code> dans le même ordre que ci-dessus :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">rank</span> <span class=\"o\">=</span> <span class=\"n\">SearchRank</span><span class=\"p\">(</span><span class=\"n\">vector</span><span class=\"p\">,</span> <span class=\"n\">query</span><span class=\"p\">,</span> <span class=\"n\">weights</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"mf\">0.2</span><span class=\"p\">,</span> <span class=\"mf\">0.4</span><span class=\"p\">,</span> <span class=\"mf\">0.6</span><span class=\"p\">,</span> <span class=\"mf\">0.8</span><span class=\"p\">])</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span><span class=\"n\">rank</span><span class=\"o\">=</span><span class=\"n\">rank</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">rank__gte</span><span class=\"o\">=</span><span class=\"mf\">0.3</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;-rank&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"performance\">\n<h2>Performance<a class=\"heading-anchor\" href=\"#performance\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Il n’est pas nécessaire de disposer d’une configuration de base de données spéciale pour utiliser ces fonctions. Cependant, si vous recherchez dans plus de quelques centaines d’enregistrements, vous risquez de rencontrer des problèmes de performance. La recherche plein texte est un processus plus intensif que la comparaison de la taille d’un nombre entier, par exemple.</p>\n<p>Dans le cas où tous les champs dans lesquels vous recherchez sont contenus dans un modèle particulier, vous pouvez créer un index fonctionnel qui correspond au vecteur de recherche que vous souhaitez utiliser. La documentation de PostgreSQL contient des détails sur la <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/static/textsearch-tables.html#TEXTSEARCH-TABLES-INDEX\">création d’index pour la recherche plein texte</a>.</p>\n<section id=\"searchvectorfield\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">SearchVectorField</span></code><a class=\"heading-anchor\" href=\"#searchvectorfield\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.search.SearchVectorField\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">SearchVectorField</span></span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.search.SearchVectorField\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Si cette approche devient trop lente, vous pouvez ajouter un champ <code class=\"docutils literal notranslate\"><span class=\"pre\">SearchVectorField</span></code> à votre modèle. Il faudra assurer son remplissage par des déclencheurs, par exemple, comme expliqué dans la <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/static/textsearch-features.html#TEXTSEARCH-UPDATE-TRIGGERS\">documentation PostgreSQL</a>. Il est alors possible d’interroger le champ comme s’il s’agissait d’un vecteur annoté <code class=\"docutils literal notranslate\"><span class=\"pre\">SearchVector</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">update</span><span class=\"p\">(</span><span class=\"n\">search_vector</span><span class=\"o\">=</span><span class=\"n\">SearchVector</span><span class=\"p\">(</span><span class=\"s1\">&#39;body_text&#39;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">search_vector</span><span class=\"o\">=</span><span class=\"s1\">&#39;cheese&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[&lt;Entry: Cheese on Toast recipes&gt;, &lt;Entry: Pizza recipes&gt;]</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"trigram-similarity\">\n<h2>Similarité par trigramme<a class=\"heading-anchor\" href=\"#trigram-similarity\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Une autre approche de la recherche est la similitude par trigramme. Un trigramme est un groupe de trois caractères consécutifs. En plus de l’expression de recherche <a class=\"reference internal\" href=\"/fr/2.0/ref/contrib/postgres/lookups/#std-fieldlookup-trigram_similar\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">trigram_similar</span></code></a>, il est possible d’utiliser une certain nombre d’autres expressions.</p>\n<p>Pour les utiliser, vous devez activer <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/static/pgtrgm.html\">l’extension pg_trgm</a> dans PostgreSQL. Vous pouvez installer l’extension par une opération de migration <a class=\"reference internal\" href=\"/fr/2.0/ref/contrib/postgres/operations/#django.contrib.postgres.operations.TrigramExtension\" title=\"django.contrib.postgres.operations.TrigramExtension\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TrigramExtension</span></code></a>.</p>\n<section id=\"trigramsimilarity\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">TrigramSimilarity</span></code><a class=\"heading-anchor\" href=\"#trigramsimilarity\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.search.TrigramSimilarity\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">TrigramSimilarity</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expression</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">string</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.search.TrigramSimilarity\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Accepte un nom de champ ou une expression, ainsi qu’une chaîne ou une expression. Renvoie la similitude par trigramme entre les deux paramètres.</p>\n<p>Exemple d’utilisation :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.postgres.search</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TrigramSimilarity</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Katy Stevens&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Stephen Keats&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">test</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Katie Stephens&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">similarity</span><span class=\"o\">=</span><span class=\"n\">TrigramSimilarity</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"n\">test</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">similarity__gt</span><span class=\"o\">=</span><span class=\"mf\">0.3</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;-similarity&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[&lt;Author: Katy Stevens&gt;, &lt;Author: Stephen Keats&gt;]</span>\n</code></pre></div>\n</section>\n<section id=\"trigramdistance\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">TrigramDistance</span></code><a class=\"heading-anchor\" href=\"#trigramdistance\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.search.TrigramDistance\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">TrigramDistance</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expression</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">string</span></span></em>, <em class=\"sig-param\"><span class=\"o\"><span class=\"pre\">**</span></span><span class=\"n\"><span class=\"pre\">extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.search.TrigramDistance\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Accepte un nom de champ ou une expression, ainsi qu’une chaîne ou une expression. Renvoie la distance par trigramme entre les deux paramètres.</p>\n<p>Exemple d’utilisation :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.postgres.search</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">TrigramDistance</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Katy Stevens&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;Stephen Keats&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">test</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;Katie Stephens&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">distance</span><span class=\"o\">=</span><span class=\"n\">TrigramDistance</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">,</span> <span class=\"n\">test</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">distance__lte</span><span class=\"o\">=</span><span class=\"mf\">0.7</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">order_by</span><span class=\"p\">(</span><span class=\"s1\">&#39;distance&#39;</span><span class=\"p\">)</span>\n<span class=\"go\">[&lt;Author: Katy Stevens&gt;, &lt;Author: Stephen Keats&gt;]</span>\n</code></pre></div>\n</section>\n</section>","rootId":"full-text-search","toc":[{"title":"L’expression de recherche search","anchor":"the-search-lookup","children":[]},{"title":"SearchVector","anchor":"searchvector","children":[]},{"title":"SearchQuery","anchor":"searchquery","children":[]},{"title":"SearchRank","anchor":"searchrank","children":[]},{"title":"Modification de la configuration de recherche","anchor":"changing-the-search-configuration","children":[]},{"title":"Pondération des requêtes","anchor":"weighting-queries","children":[]},{"title":"Performance","anchor":"performance","children":[{"title":"SearchVectorField","anchor":"searchvectorfield","children":[]}]},{"title":"Similarité par trigramme","anchor":"trigram-similarity","children":[{"title":"TrigramSimilarity","anchor":"trigramsimilarity","children":[]},{"title":"TrigramDistance","anchor":"trigramdistance","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/2.0/ref/"},{"docname":"ref/contrib/index","title":"Paquets contrib","url":"/fr/2.0/ref/contrib/"},{"docname":"ref/contrib/postgres/index","title":"django.contrib.postgres","url":"/fr/2.0/ref/contrib/postgres/"}],"prev":{"docname":"ref/contrib/postgres/operations","title":"Opérations de migration de base de données","url":"/fr/2.0/ref/contrib/postgres/operations/"},"next":{"docname":"ref/contrib/postgres/validators","title":"Validateurs","url":"/fr/2.0/ref/contrib/postgres/validators/"},"formats":{"html":"/fr/2.0/ref/contrib/postgres/search/","markdown":"/fr/2.0/ref/contrib/postgres/search.md","json":"/fr/2.0/ref/contrib/postgres/search.json"},"source":"https://github.com/django/django/blob/stable/2.0.x/docs/ref/contrib/postgres/search.txt","official":"https://docs.djangoproject.com/fr/2.0/ref/contrib/postgres/search/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}