{"title":"Full text search","version":"3.0","locale":"pl","docname":"ref/contrib/postgres/search","url":"/pl/3.0/ref/contrib/postgres/search/","canonical":"https://djangodocs.dev/pl/3.0/ref/contrib/postgres/search/","summary":"The database functions in the django.contrib.postgres.search module ease the use of PostgreSQL’s full text search engine . For the examples in this document, we’ll…","html":"<h1>Full text search<a class=\"heading-anchor\" href=\"#full-text-search\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>The database functions in the <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.postgres.search</span></code> module ease\nthe use of PostgreSQL’s <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/textsearch.html\">full text search engine</a>.</p>\n<p>For the examples in this document, we’ll use the models defined in\n<a class=\"reference internal\" href=\"/pl/3.0/topics/db/queries/\"><span class=\"doc\">Wykonywanie zapytań</span></a>.</p>\n<aside class=\"admonition admonition-seealso\">\n<p class=\"admonition-title\">Zobacz także</p>\n<p>For a high-level overview of searching, see the <a class=\"reference internal\" href=\"/pl/3.0/topics/db/search/\"><span class=\"doc\">topic documentation</span></a>.</p>\n</aside>\n<section id=\"the-search-lookup\">\n<h2>The <code class=\"docutils literal notranslate\"><span class=\"pre\">search</span></code> lookup<a class=\"heading-anchor\" href=\"#the-search-lookup\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p id=\"std-fieldlookup-search\">A common way to use full text search is to search a single term against a\nsingle column in the database. For example:</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>This creates a <code class=\"docutils literal notranslate\"><span class=\"pre\">to_tsvector</span></code> in the database from the <code class=\"docutils literal notranslate\"><span class=\"pre\">body_text</span></code> field\nand a <code class=\"docutils literal notranslate\"><span class=\"pre\">plainto_tsquery</span></code> from the search term <code class=\"docutils literal notranslate\"><span class=\"pre\">'Cheese'</span></code>, both using the\ndefault database search configuration. The results are obtained by matching the\nquery and the vector.</p>\n<p>To use the <code class=\"docutils literal notranslate\"><span class=\"pre\">search</span></code> lookup, <code class=\"docutils literal notranslate\"><span class=\"pre\">'django.contrib.postgres'</span></code> must be in your\n<a class=\"reference internal\" href=\"/pl/3.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\">Link to this heading</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=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">expressions</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>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">weight</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.SearchVector\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Searching against a single field is great but rather limiting. The <code class=\"docutils literal notranslate\"><span class=\"pre\">Entry</span></code>\ninstances we’re searching belong to a <code class=\"docutils literal notranslate\"><span class=\"pre\">Blog</span></code>, which has a <code class=\"docutils literal notranslate\"><span class=\"pre\">tagline</span></code> field.\nTo query against both fields, use a <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>The arguments to <code class=\"docutils literal notranslate\"><span class=\"pre\">SearchVector</span></code> can be any\n<a class=\"reference internal\" href=\"/pl/3.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> or the name of a field. Multiple\narguments will be concatenated together using a space so that the search\ndocument includes them all.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">SearchVector</span></code> objects can be combined together, allowing you to reuse them.\nFor example:</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>See <a class=\"reference internal\" href=\"#postgresql-fts-search-configuration\"><span class=\"std std-ref\">Changing the search configuration</span></a> and\n<a class=\"reference internal\" href=\"#postgresql-fts-weighting-queries\"><span class=\"std std-ref\">Weighting queries</span></a> for an explanation of the <code class=\"docutils literal notranslate\"><span class=\"pre\">config</span></code>\nand <code class=\"docutils literal notranslate\"><span class=\"pre\">weight</span></code> parameters.</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\">Link to this heading</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>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">search_type</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">'plain'</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.search.SearchQuery\"><span class=\"visually-hidden\">Link to this definition</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> translates the terms the user provides into a search query\nobject that the database compares to a search vector. By default, all the words\nthe user provides are passed through the stemming algorithms, and then it\nlooks for matches for all of the resulting terms.</p>\n<p>If <code class=\"docutils literal notranslate\"><span class=\"pre\">search_type</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">'plain'</span></code>, which is the default, the terms are treated\nas separate keywords. If <code class=\"docutils literal notranslate\"><span class=\"pre\">search_type</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">'phrase'</span></code>, the terms are treated\nas a single phrase. If <code class=\"docutils literal notranslate\"><span class=\"pre\">search_type</span></code> is <code class=\"docutils literal notranslate\"><span class=\"pre\">'raw'</span></code>, then you can provide a\nformatted search query with terms and operators. Read PostgreSQL’s <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES\">Full Text\nSearch docs</a> to learn about differences and syntax. Examples:</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;red tomato&#39;</span><span class=\"p\">)</span>  <span class=\"c1\"># two keywords</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">SearchQuery</span><span class=\"p\">(</span><span class=\"s1\">&#39;tomato red&#39;</span><span class=\"p\">)</span>  <span class=\"c1\"># same results as above</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">SearchQuery</span><span class=\"p\">(</span><span class=\"s1\">&#39;red tomato&#39;</span><span class=\"p\">,</span> <span class=\"n\">search_type</span><span class=\"o\">=</span><span class=\"s1\">&#39;phrase&#39;</span><span class=\"p\">)</span>  <span class=\"c1\"># a phrase</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">SearchQuery</span><span class=\"p\">(</span><span class=\"s1\">&#39;tomato red&#39;</span><span class=\"p\">,</span> <span class=\"n\">search_type</span><span class=\"o\">=</span><span class=\"s1\">&#39;phrase&#39;</span><span class=\"p\">)</span>  <span class=\"c1\"># a different phrase</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">SearchQuery</span><span class=\"p\">(</span><span class=\"s2\">&quot;&#39;tomato&#39; &amp; (&#39;red&#39; | &#39;green&#39;)&quot;</span><span class=\"p\">,</span> <span class=\"n\">search_type</span><span class=\"o\">=</span><span class=\"s1\">&#39;raw&#39;</span><span class=\"p\">)</span>  <span class=\"c1\"># boolean operators</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">SearchQuery</span></code> terms can be combined logically to provide more flexibility:</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>See <a class=\"reference internal\" href=\"#postgresql-fts-search-configuration\"><span class=\"std std-ref\">Changing the search configuration</span></a> for an explanation of the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">config</span></code> parameter.</p>\n<aside class=\"version-note version-added\" data-version=\"2.2\">\n<p class=\"version-note-title\">New in Django 2.2</p><p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">search_type</span></code> parameter was added.</p>\n</aside>\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\">Link to this heading</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>So far, we’ve returned the results for which any match between the vector and\nthe query are possible. It’s likely you may wish to order the results by some\nsort of relevancy. PostgreSQL provides a ranking function which takes into\naccount how often the query terms appear in the document, how close together\nthe terms are in the document, and how important the part of the document is\nwhere they occur. The better the match, the higher the value of the rank. To\norder by relevancy:</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>See <a class=\"reference internal\" href=\"#postgresql-fts-weighting-queries\"><span class=\"std std-ref\">Weighting queries</span></a> for an explanation of the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">weights</span></code> parameter.</p>\n</section>\n<section id=\"changing-the-search-configuration\">\n<span id=\"postgresql-fts-search-configuration\"></span><h2>Changing the search configuration<a class=\"heading-anchor\" href=\"#changing-the-search-configuration\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>You can specify the <code class=\"docutils literal notranslate\"><span class=\"pre\">config</span></code> attribute to a <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> and\n<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> to use a different search configuration. This allows using\ndifferent language parsers and dictionaries as defined by the database:</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>The value of <code class=\"docutils literal notranslate\"><span class=\"pre\">config</span></code> could also be stored in another column:</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>Weighting queries<a class=\"heading-anchor\" href=\"#weighting-queries\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Every field may not have the same relevance in a query, so you can set weights\nof various vectors before you combine them:</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>The weight should be one of the following letters: D, C, B, A. By default,\nthese weights refer to the numbers <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>, and <code class=\"docutils literal notranslate\"><span class=\"pre\">1.0</span></code>,\nrespectively. If you wish to weight them differently, pass a list of four\nfloats to <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> as <code class=\"docutils literal notranslate\"><span class=\"pre\">weights</span></code> in the same order above:</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\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Special database configuration isn’t necessary to use any of these functions,\nhowever, if you’re searching more than a few hundred records, you’re likely to\nrun into performance problems. Full text search is a more intensive process\nthan comparing the size of an integer, for example.</p>\n<p>In the event that all the fields you’re querying on are contained within one\nparticular model, you can create a functional index which matches the search\nvector you wish to use. The PostgreSQL documentation has details on\n<a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/textsearch-tables.html#TEXTSEARCH-TABLES-INDEX\">creating indexes for full text search</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\">Link to this heading</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>If this approach becomes too slow, you can add a <code class=\"docutils literal notranslate\"><span class=\"pre\">SearchVectorField</span></code> to your\nmodel. You’ll need to keep it populated with triggers, for example, as\ndescribed in the <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/textsearch-features.html#TEXTSEARCH-UPDATE-TRIGGERS\">PostgreSQL documentation</a>. You can then query the field as\nif it were an annotated <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>Trigram similarity<a class=\"heading-anchor\" href=\"#trigram-similarity\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Another approach to searching is trigram similarity. A trigram is a group of\nthree consecutive characters. In addition to the <a class=\"reference internal\" href=\"/pl/3.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>\nlookup, you can use a couple of other expressions.</p>\n<p>To use them, you need to activate the <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/pgtrgm.html\">pg_trgm extension</a> on PostgreSQL. You can\ninstall it using the\n<a class=\"reference internal\" href=\"/pl/3.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> migration\noperation.</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\">Link to this heading</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Accepts a field name or expression, and a string or expression. Returns the\ntrigram similarity between the two arguments.</p>\n<p>Usage example:</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\">Link to this heading</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Accepts a field name or expression, and a string or expression. Returns the\ntrigram distance between the two arguments.</p>\n<p>Usage example:</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":"The search lookup","anchor":"the-search-lookup","children":[]},{"title":"SearchVector","anchor":"searchvector","children":[]},{"title":"SearchQuery","anchor":"searchquery","children":[]},{"title":"SearchRank","anchor":"searchrank","children":[]},{"title":"Changing the search configuration","anchor":"changing-the-search-configuration","children":[]},{"title":"Weighting queries","anchor":"weighting-queries","children":[]},{"title":"Performance","anchor":"performance","children":[{"title":"SearchVectorField","anchor":"searchvectorfield","children":[]}]},{"title":"Trigram similarity","anchor":"trigram-similarity","children":[{"title":"TrigramSimilarity","anchor":"trigramsimilarity","children":[]},{"title":"TrigramDistance","anchor":"trigramdistance","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API Reference","url":"/pl/3.0/ref/"},{"docname":"ref/contrib/index","title":"contrib packages","url":"/pl/3.0/ref/contrib/"},{"docname":"ref/contrib/postgres/index","title":"django.contrib.postgres","url":"/pl/3.0/ref/contrib/postgres/"}],"prev":{"docname":"ref/contrib/postgres/operations","title":"Database migration operations","url":"/pl/3.0/ref/contrib/postgres/operations/"},"next":{"docname":"ref/contrib/postgres/validators","title":"Validators","url":"/pl/3.0/ref/contrib/postgres/validators/"},"formats":{"html":"/pl/3.0/ref/contrib/postgres/search/","markdown":"/pl/3.0/ref/contrib/postgres/search.md","json":"/pl/3.0/ref/contrib/postgres/search.json"},"source":"https://github.com/django/django/blob/stable/3.0.x/docs/ref/contrib/postgres/search.txt","official":"https://docs.djangoproject.com/pl/3.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"]}