{"title":"全文搜索","version":"6.1","locale":"zh-hans","docname":"ref/contrib/postgres/search","url":"/zh-hans/6.1/ref/contrib/postgres/search/","canonical":"https://djangodocs.dev/zh-hans/6.1/ref/contrib/postgres/search/","summary":"django.contrib.postgres.search 模块中的数据库函数方便了 PostgreSQL 的全文搜索引擎的使用。在本文档的例子中，我们将使用执行查询中定义的模型。","html":"<h1>全文搜索<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><code class=\"docutils literal notranslate\">django.contrib.postgres.search</code> 模块中的数据库函数方便了 PostgreSQL 的 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/textsearch.html\">全文搜索引擎</a> 的使用。</p>\n<p>在本文档的例子中，我们将使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/queries/\"><span class=\"doc\">执行查询</span></a> 中定义的模型。</p>\n<aside class=\"admonition admonition-seealso\" role=\"note\">\n<p class=\"admonition-title\">See also</p>\n<p>有关搜索的高级概述，请参见 <a class=\"reference internal\" href=\"/zh-hans/6.1/topics/db/search/\"><span class=\"doc\">主题文档</span></a>。</p>\n</aside>\n<section id=\"the-search-lookup\">\n<h2><code class=\"docutils literal notranslate\">search</code> 查找<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\">常见的使用全文搜索的方式是对数据库中的单个列搜索单个术语。例如：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>body_text__search<span class=\"o\">=</span><span class=\"s2\">&quot;Cheese&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Entry: Cheese on Toast recipes&gt;, &lt;Entry: Pizza Recipes&gt;]&gt;</span>\n</code></pre></div>\n<p>这将使用默认的数据库搜索配置，从 <code class=\"docutils literal notranslate\">body_text</code> 字段在数据库中创建一个 <code class=\"docutils literal notranslate\">to_tsvector</code>，从搜索词 <code class=\"docutils literal notranslate\">'Cheese'</code> 中创建一个 <code class=\"docutils literal notranslate\">plainto_tsquery</code>。通过匹配查询和向量得到结果。</p>\n<p>要使用 <code class=\"docutils literal notranslate\">search</code> 查找，<code class=\"docutils literal notranslate\">'django.contrib.postgres'</code> 必须在你的 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a>。</p>\n</section>\n<section id=\"searchvector\">\n<h2><code class=\"docutils literal notranslate\">SearchVector</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\">class</span> </em><span class=\"sig-name descname\">SearchVector</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>expressions</em>, <em class=\"sig-param\">config<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">weight<span class=\"o\">=</span><span class=\"default_value\">None</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>对单个字段进行搜索非常有用，但也有一定的限制。我们要搜索的 <code class=\"docutils literal notranslate\">Entry</code> 实例属于一个 <code class=\"docutils literal notranslate\">Blog</code>，该 <code class=\"docutils literal notranslate\">Blog</code> 有一个 <code class=\"docutils literal notranslate\">tagline</code> 字段。要对这两个字段进行查询，可以使用 <code class=\"docutils literal notranslate\">SearchVector</code>：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.search</span> <span class=\"kn\">import</span> SearchVector\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    search<span class=\"o\">=</span>SearchVector<span class=\"p\">(</span><span class=\"s2\">&quot;body_text&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;blog__tagline&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>search<span class=\"o\">=</span><span class=\"s2\">&quot;Cheese&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Entry: Cheese on Toast recipes&gt;, &lt;Entry: Pizza Recipes&gt;]&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">SearchVector</code> 的参数可以是任何 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/expressions/#django.db.models.Expression\" title=\"django.db.models.Expression\"><code class=\"xref py py-class docutils literal notranslate\">Expression</code></a> 或字段名。多个参数将使用空格连接在一起，这样搜索文档就会包含所有参数。</p>\n<p><code class=\"docutils literal notranslate\">SearchVector</code> 对象可以组合在一起，允许您重复使用它们。例如：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    search<span class=\"o\">=</span>SearchVector<span class=\"p\">(</span><span class=\"s2\">&quot;body_text&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> SearchVector<span class=\"p\">(</span><span class=\"s2\">&quot;blog__tagline&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>search<span class=\"o\">=</span><span class=\"s2\">&quot;Cheese&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Entry: Cheese on Toast recipes&gt;, &lt;Entry: Pizza Recipes&gt;]&gt;</span>\n</code></pre></div>\n<p>关于 <code class=\"docutils literal notranslate\">config</code> 和 <code class=\"docutils literal notranslate\">weight</code> 参数的解释，请参见 <a class=\"reference internal\" href=\"#postgresql-fts-search-configuration\"><span class=\"std std-ref\">更改搜索配置</span></a> 和 <a class=\"reference internal\" href=\"#postgresql-fts-weighting-queries\"><span class=\"std std-ref\">加权查询</span></a>。</p>\n</section>\n<section id=\"searchquery\">\n<h2><code class=\"docutils literal notranslate\">SearchQuery</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\">class</span> </em><span class=\"sig-name descname\">SearchQuery</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">value</em>, <em class=\"sig-param\">config<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">search_type<span class=\"o\">=</span><span class=\"default_value\">'plain'</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\">SearchQuery</code> 将用户提供的术语转化为搜索查询对象，数据库将其与搜索向量进行比较。默认情况下，用户提供的所有词语都会通过词干算法，然后寻找所有结果词语的匹配。</p>\n<p>如果 <code class=\"docutils literal notranslate\">search_type</code> 是 <code class=\"docutils literal notranslate\">'plain'</code>，即默认值，则将术语作为单独的关键字处理。如果 <code class=\"docutils literal notranslate\">search_type</code> 是 <code class=\"docutils literal notranslate\">'phrase'</code>，则将术语作为一个单一的短语处理。如果 <code class=\"docutils literal notranslate\">search_type</code> 是 <code class=\"docutils literal notranslate\">'raw'</code>，那么你可以提供一个带有术语和运算符的格式化搜索查询。如果 <code class=\"docutils literal notranslate\">search_type</code> 是 <code class=\"docutils literal notranslate\">'websearch'</code>，那么你可以提供一个格式化的搜索查询，类似于网络搜索引擎使用的格式。<code class=\"docutils literal notranslate\">'websearch'</code> 需要 PostgreSQL ≥ 11。请阅读 PostgreSQL 的 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-PARSING-QUERIES\">全文搜索文档</a> 来了解两者的区别和语法。举例说明。</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.search</span> <span class=\"kn\">import</span> SearchQuery<span class=\"p\">,</span> Lexeme\n<span class=\"gp\">&gt;&gt;&gt; </span>SearchQuery<span class=\"p\">(</span><span class=\"s2\">&quot;red tomato&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># two keywords</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>SearchQuery<span class=\"p\">(</span><span class=\"s2\">&quot;tomato red&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># same results as above</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>SearchQuery<span class=\"p\">(</span><span class=\"s2\">&quot;red tomato&quot;</span><span class=\"p\">,</span> search_type<span class=\"o\">=</span><span class=\"s2\">&quot;phrase&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># a phrase</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>SearchQuery<span class=\"p\">(</span><span class=\"s2\">&quot;tomato red&quot;</span><span class=\"p\">,</span> search_type<span class=\"o\">=</span><span class=\"s2\">&quot;phrase&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># a different phrase</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>SearchQuery<span class=\"p\">(</span><span class=\"s2\">&quot;&#39;tomato&#39; &amp; (&#39;red&#39; | &#39;green&#39;)&quot;</span><span class=\"p\">,</span> search_type<span class=\"o\">=</span><span class=\"s2\">&quot;raw&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># boolean operators</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>SearchQuery<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;&#39;tomato&#39; (&#39;red&#39; OR &#39;green&#39;)&quot;</span><span class=\"p\">,</span> search_type<span class=\"o\">=</span><span class=\"s2\">&quot;websearch&quot;</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>  <span class=\"c1\"># websearch operators</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>SearchQuery<span class=\"p\">(</span>Lexeme<span class=\"p\">(</span><span class=\"s2\">&quot;tomato&quot;</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> <span class=\"p\">(</span>Lexeme<span class=\"p\">(</span><span class=\"s2\">&quot;red&quot;</span><span class=\"p\">)</span> <span class=\"o\">|</span> Lexeme<span class=\"p\">(</span><span class=\"s2\">&quot;green&quot;</span><span class=\"p\">)))</span>  <span class=\"c1\"># Lexeme objects</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">SearchQuery</code> 术语可以逻辑组合，以提供更大的灵活性：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.search</span> <span class=\"kn\">import</span> SearchQuery\n<span class=\"gp\">&gt;&gt;&gt; </span>SearchQuery<span class=\"p\">(</span><span class=\"s2\">&quot;meat&quot;</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> SearchQuery<span class=\"p\">(</span><span class=\"s2\">&quot;cheese&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># AND</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>SearchQuery<span class=\"p\">(</span><span class=\"s2\">&quot;meat&quot;</span><span class=\"p\">)</span> <span class=\"o\">|</span> SearchQuery<span class=\"p\">(</span><span class=\"s2\">&quot;cheese&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># OR</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"o\">~</span>SearchQuery<span class=\"p\">(</span><span class=\"s2\">&quot;meat&quot;</span><span class=\"p\">)</span>  <span class=\"c1\"># NOT</span>\n</code></pre></div>\n<p>参见 <a class=\"reference internal\" href=\"#postgresql-fts-search-configuration\"><span class=\"std std-ref\">更改搜索配置</span></a> 对 <code class=\"docutils literal notranslate\">config</code> 参数的解释。</p>\n<aside class=\"version-note version-changed\" data-version=\"6.0\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 6.0</p><p><a class=\"reference internal\" href=\"#django.contrib.postgres.search.Lexeme\" title=\"django.contrib.postgres.search.Lexeme\"><code class=\"xref py py-class docutils literal notranslate\">Lexeme</code></a> objects were added.</p>\n</aside>\n</section>\n<section id=\"searchrank\">\n<h2><code class=\"docutils literal notranslate\">SearchRank</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\">class</span> </em><span class=\"sig-name descname\">SearchRank</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">vector</em>, <em class=\"sig-param\">query</em>, <em class=\"sig-param\">weights<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">normalization<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">cover_density<span class=\"o\">=</span><span class=\"default_value\">False</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>到目前为止，我们已经返回了向量和查询之间可能存在任何匹配的结果。您可能希望按某种相关性对结果进行排序。PostgreSQL 提供了一个排名函数，该函数考虑了查询术语在文档中出现的频率、术语在文档中的紧密程度以及它们出现的文档部分的重要性。匹配越好，排名的值就越高。要按相关性排序：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.search</span> <span class=\"kn\">import</span> SearchQuery<span class=\"p\">,</span> SearchRank<span class=\"p\">,</span> SearchVector\n<span class=\"gp\">&gt;&gt;&gt; </span>vector <span class=\"o\">=</span> SearchVector<span class=\"p\">(</span><span class=\"s2\">&quot;body_text&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>query <span class=\"o\">=</span> SearchQuery<span class=\"p\">(</span><span class=\"s2\">&quot;cheese&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>rank<span class=\"o\">=</span>SearchRank<span class=\"p\">(</span>vector<span class=\"p\">,</span> query<span class=\"p\">))</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;-rank&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Entry: Cheese on Toast recipes&gt;, &lt;Entry: Pizza recipes&gt;]&gt;</span>\n</code></pre></div>\n<p>参见 <a class=\"reference internal\" href=\"#postgresql-fts-weighting-queries\"><span class=\"std std-ref\">加权查询</span></a> 关于 <code class=\"docutils literal notranslate\">weights</code> 参数的解释。</p>\n<p>将 <code class=\"docutils literal notranslate\">cover_density</code> 参数设置为 <code class=\"docutils literal notranslate\">True</code>，启用覆盖密度排序，即考虑匹配的查询词的接近程度。</p>\n<p>提供一个整数给 <code class=\"docutils literal notranslate\">normalization</code> 参数来控制排名的归一化。这个整数是一个位掩码，所以您可以组合多种行为：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Value\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    rank<span class=\"o\">=</span>SearchRank<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        vector<span class=\"p\">,</span>\n<span class=\"gp\">... </span>        query<span class=\"p\">,</span>\n<span class=\"gp\">... </span>        normalization<span class=\"o\">=</span>Value<span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">)</span><span class=\"o\">.</span>bitor<span class=\"p\">(</span>Value<span class=\"p\">(</span><span class=\"mi\">4</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span>    <span class=\"p\">)</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>PostgreSQL 文档中有更多关于 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-RANKING\">不同排序归一化选项</a> 的细节。</p>\n</section>\n<section id=\"searchheadline\">\n<h2><code class=\"docutils literal notranslate\">SearchHeadline</code><a class=\"heading-anchor\" href=\"#searchheadline\"><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.SearchHeadline\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">SearchHeadline</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</em>, <em class=\"sig-param\">query</em>, <em class=\"sig-param\">config<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">start_sel<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">stop_sel<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">max_words<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">min_words<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">short_word<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">highlight_all<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">max_fragments<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">fragment_delimiter<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.search.SearchHeadline\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>接受一个文本字段或一个表达式、一个查询、一个配置和一组选项。返回高亮显示的搜索结果。</p>\n<p>将 <code class=\"docutils literal notranslate\">start_sel</code> 和 <code class=\"docutils literal notranslate\">stop_sel</code> 参数设置为字符串值，用于在文档中高亮显示查询词。PostgreSQL 的默认值是 <code class=\"docutils literal notranslate\">&lt;b&gt;</code> 和 <code class=\"docutils literal notranslate\">&lt;/b&gt;</code>。</p>\n<p>为 <code class=\"docutils literal notranslate\">max_words</code> 和 <code class=\"docutils literal notranslate\">min_words</code> 参数提供整数值，以确定最长和最短的标题。PostgreSQL 的默认值是 35 和 15。</p>\n<p>为 <code class=\"docutils literal notranslate\">short_word</code> 参数提供一个整数值，以便在每个标题中丢弃这个长度或更少的字。PostgreSQL 的默认值是 3。</p>\n<p>将 <code class=\"docutils literal notranslate\">highlight_all</code> 参数设置为 <code class=\"docutils literal notranslate\">True</code>，以使用整个文档来代替片段，并忽略 <code class=\"docutils literal notranslate\">max_words</code>、<code class=\"docutils literal notranslate\">min_words</code> 和 <code class=\"docutils literal notranslate\">short_word</code> 参数。这在 PostgreSQL 中是默认禁用的。</p>\n<p>为 <code class=\"docutils literal notranslate\">max_fragments</code> 提供一个非零的整数值，以设置要显示的最大片段数。在 PostgreSQL 中默认是禁用的。</p>\n<p>设置 <code class=\"docutils literal notranslate\">fragment_delimiter</code> 字符串参数来配置片段之间的定界符。PostgreSQL 的默认值是 <code class=\"docutils literal notranslate\">&quot; ... &quot;</code>。</p>\n<p>PostgreSQL 文档中有更多关于 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/textsearch-controls.html#TEXTSEARCH-HEADLINE\">高亮搜索结果</a> 的细节。</p>\n<p>用法示例：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.search</span> <span class=\"kn\">import</span> SearchHeadline<span class=\"p\">,</span> SearchQuery\n<span class=\"gp\">&gt;&gt;&gt; </span>query <span class=\"o\">=</span> SearchQuery<span class=\"p\">(</span><span class=\"s2\">&quot;red tomato&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>entry <span class=\"o\">=</span> Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    headline<span class=\"o\">=</span>SearchHeadline<span class=\"p\">(</span>\n<span class=\"gp\">... </span>        <span class=\"s2\">&quot;body_text&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        query<span class=\"p\">,</span>\n<span class=\"gp\">... </span>        start_sel<span class=\"o\">=</span><span class=\"s2\">&quot;&lt;span&gt;&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>        stop_sel<span class=\"o\">=</span><span class=\"s2\">&quot;&lt;/span&gt;&quot;</span><span class=\"p\">,</span>\n<span class=\"gp\">... </span>    <span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>get<span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>entry<span class=\"o\">.</span>headline<span class=\"p\">)</span>\n<span class=\"go\">Sandwich with &lt;span&gt;tomato&lt;/span&gt; and &lt;span&gt;red&lt;/span&gt; cheese.</span>\n</code></pre></div>\n<p>参见 <a class=\"reference internal\" href=\"#postgresql-fts-search-configuration\"><span class=\"std std-ref\">更改搜索配置</span></a> 对 <code class=\"docutils literal notranslate\">config</code> 参数的解释。</p>\n</section>\n<section id=\"changing-the-search-configuration\">\n<span id=\"postgresql-fts-search-configuration\"></span><h2>更改搜索配置<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>您可以为 <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\">SearchVector</code></a> 和 <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\">SearchQuery</code></a> 指定 <code class=\"docutils literal notranslate\">config</code> 属性，以使用不同的搜索配置。这允许使用数据库定义的不同语言解析器和字典：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.search</span> <span class=\"kn\">import</span> SearchQuery<span class=\"p\">,</span> SearchVector\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    search<span class=\"o\">=</span>SearchVector<span class=\"p\">(</span><span class=\"s2\">&quot;body_text&quot;</span><span class=\"p\">,</span> config<span class=\"o\">=</span><span class=\"s2\">&quot;french&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>search<span class=\"o\">=</span>SearchQuery<span class=\"p\">(</span><span class=\"s2\">&quot;œuf&quot;</span><span class=\"p\">,</span> config<span class=\"o\">=</span><span class=\"s2\">&quot;french&quot;</span><span class=\"p\">))</span>\n<span class=\"go\">&lt;QuerySet [&lt;Entry: Pain perdu&gt;]&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">config</code> 的值也可以存储在另一个列中：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> F\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    search<span class=\"o\">=</span>SearchVector<span class=\"p\">(</span><span class=\"s2\">&quot;body_text&quot;</span><span class=\"p\">,</span> config<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;blog__language&quot;</span><span class=\"p\">)),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>search<span class=\"o\">=</span>SearchQuery<span class=\"p\">(</span><span class=\"s2\">&quot;œuf&quot;</span><span class=\"p\">,</span> config<span class=\"o\">=</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;blog__language&quot;</span><span class=\"p\">)))</span>\n<span class=\"go\">&lt;QuerySet [&lt;Entry: Pain perdu&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"weighting-queries\">\n<span id=\"postgresql-fts-weighting-queries\"></span><h2>加权查询<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>不同字段在查询中的相关性可能不同，因此您可以在将它们组合之前设置各个向量的权重：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.search</span> <span class=\"kn\">import</span> SearchQuery<span class=\"p\">,</span> SearchRank<span class=\"p\">,</span> SearchVector\n<span class=\"gp\">&gt;&gt;&gt; </span>vector <span class=\"o\">=</span> SearchVector<span class=\"p\">(</span><span class=\"s2\">&quot;body_text&quot;</span><span class=\"p\">,</span> weight<span class=\"o\">=</span><span class=\"s2\">&quot;A&quot;</span><span class=\"p\">)</span> <span class=\"o\">+</span> SearchVector<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;blog__tagline&quot;</span><span class=\"p\">,</span> weight<span class=\"o\">=</span><span class=\"s2\">&quot;B&quot;</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>query <span class=\"o\">=</span> SearchQuery<span class=\"p\">(</span><span class=\"s2\">&quot;cheese&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>rank<span class=\"o\">=</span>SearchRank<span class=\"p\">(</span>vector<span class=\"p\">,</span> query<span class=\"p\">))</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>rank__gte<span class=\"o\">=</span><span class=\"mf\">0.3</span><span class=\"p\">)</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"s2\">&quot;rank&quot;</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n</code></pre></div>\n<p>权重应该是以下字母之一：D、C、B、A。默认情况下，这些权重分别对应数字 <code class=\"docutils literal notranslate\">0.1</code>、<code class=\"docutils literal notranslate\">0.2</code>、<code class=\"docutils literal notranslate\">0.4</code> 和 <code class=\"docutils literal notranslate\">1.0</code>。如果您希望以不同的方式设置权重，可以将一个包含四个浮点数的列表传递给 <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\">SearchRank</code></a>，按照上述相同的顺序设置权重：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>rank <span class=\"o\">=</span> SearchRank<span class=\"p\">(</span>vector<span class=\"p\">,</span> query<span class=\"p\">,</span> weights<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>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>rank<span class=\"o\">=</span>rank<span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>rank__gte<span class=\"o\">=</span><span class=\"mf\">0.3</span><span class=\"p\">)</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;-rank&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n<section id=\"lexeme\">\n<h2><code class=\"docutils literal notranslate\">Lexeme</code><a class=\"heading-anchor\" href=\"#lexeme\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<aside class=\"version-note version-added\" data-version=\"6.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 6.0</p></aside>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.contrib.postgres.search.Lexeme\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">Lexeme</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">value</em>, <em class=\"sig-param\">output_field<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\">*</abbr></span></em>, <em class=\"sig-param\">invert<span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\">prefix<span class=\"o\">=</span><span class=\"default_value\">False</span></em>, <em class=\"sig-param\">weight<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.search.Lexeme\"><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\">Lexeme</code> objects allow search operators to be safely used with strings from\nan untrusted source. The content of each lexeme is escaped so that any\noperators that may exist in the string itself will not be interpreted.</p>\n<p>You can combine lexemes with other lexemes using the <code class=\"docutils literal notranslate\">&amp;</code> and <code class=\"docutils literal notranslate\">|</code> operators\nand also negate them with the <code class=\"docutils literal notranslate\">~</code> operator. For example:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.search</span> <span class=\"kn\">import</span> SearchQuery<span class=\"p\">,</span> SearchVector<span class=\"p\">,</span> Lexeme\n<span class=\"gp\">&gt;&gt;&gt; </span>vector <span class=\"o\">=</span> SearchVector<span class=\"p\">(</span><span class=\"s2\">&quot;body_text&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;blog__tagline&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>search<span class=\"o\">=</span>vector<span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    search<span class=\"o\">=</span>SearchQuery<span class=\"p\">(</span>Lexeme<span class=\"p\">(</span><span class=\"s2\">&quot;fruit&quot;</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> Lexeme<span class=\"p\">(</span><span class=\"s2\">&quot;dessert&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Entry: Apple Crumble Recipes&gt;, &lt;Entry: Banana Split Recipes&gt;]&gt;</span>\n</code></pre></div>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>search<span class=\"o\">=</span>vector<span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    search<span class=\"o\">=</span>SearchQuery<span class=\"p\">(</span>Lexeme<span class=\"p\">(</span><span class=\"s2\">&quot;fruit&quot;</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> Lexeme<span class=\"p\">(</span><span class=\"s2\">&quot;dessert&quot;</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> <span class=\"o\">~</span>Lexeme<span class=\"p\">(</span><span class=\"s2\">&quot;banana&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Entry: Apple Crumble Recipes&gt;]&gt;</span>\n</code></pre></div>\n<p>Lexeme objects also support term weighting and prefixes:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>search<span class=\"o\">=</span>vector<span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    search<span class=\"o\">=</span>SearchQuery<span class=\"p\">(</span>Lexeme<span class=\"p\">(</span><span class=\"s2\">&quot;Pizza&quot;</span><span class=\"p\">)</span> <span class=\"o\">|</span> Lexeme<span class=\"p\">(</span><span class=\"s2\">&quot;Cheese&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Entry: Cheese on Toast recipes&gt;, &lt;Entry: Pizza recipes&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>search<span class=\"o\">=</span>vector<span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    search<span class=\"o\">=</span>SearchQuery<span class=\"p\">(</span>Lexeme<span class=\"p\">(</span><span class=\"s2\">&quot;Pizza&quot;</span><span class=\"p\">)</span> <span class=\"o\">|</span> Lexeme<span class=\"p\">(</span><span class=\"s2\">&quot;Cheese&quot;</span><span class=\"p\">,</span> weight<span class=\"o\">=</span><span class=\"s2\">&quot;A&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Entry: Pizza recipes&gt;]&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>search<span class=\"o\">=</span>vector<span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    search<span class=\"o\">=</span>SearchQuery<span class=\"p\">(</span>Lexeme<span class=\"p\">(</span><span class=\"s2\">&quot;za&quot;</span><span class=\"p\">,</span> prefix<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">))</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet []&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"performance\">\n<h2>性能<a class=\"heading-anchor\" href=\"#performance\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>使用这些函数都不需要特殊的数据库配置，但是，如果你搜索的记录超过几百条，你很可能会遇到性能问题。例如，全文搜索是一个比比较整数大小更密集的过程。</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\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/postgres/indexes/#django.contrib.postgres.indexes.GinIndex\" title=\"django.contrib.postgres.indexes.GinIndex\"><code class=\"xref py py-class docutils literal notranslate\">GinIndex</code></a> or\n<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/postgres/indexes/#django.contrib.postgres.indexes.GistIndex\" title=\"django.contrib.postgres.indexes.GistIndex\"><code class=\"xref py py-class docutils literal notranslate\">GistIndex</code></a> which matches the search\nvector you wish to use. 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>GinIndex<span class=\"p\">(</span>\n    SearchVector<span class=\"p\">(</span><span class=\"s2\">&quot;body_text&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> config<span class=\"o\">=</span><span class=\"s2\">&quot;english&quot;</span><span class=\"p\">),</span>\n    name<span class=\"o\">=</span><span class=\"s2\">&quot;search_vector_idx&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>The PostgreSQL docs has details on <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\">SearchVectorField</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\">class</span> </em><span class=\"sig-name descname\">SearchVectorField</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>如果这种方法变得太慢，您可以在模型中添加一个 <code class=\"docutils literal notranslate\">SearchVectorField</code>。您需要使用触发器保持它的数据更新，例如，可以参考 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/textsearch-features.html#TEXTSEARCH-UPDATE-TRIGGERS\">PostgreSQL 文档</a> 中的描述。然后，您可以查询该字段，就像它是一个已注释的 <code class=\"docutils literal notranslate\">SearchVector</code> 一样：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>update<span class=\"p\">(</span>search_vector<span class=\"o\">=</span>SearchVector<span class=\"p\">(</span><span class=\"s2\">&quot;body_text&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Entry<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>search_vector<span class=\"o\">=</span><span class=\"s2\">&quot;cheese&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Entry: Cheese on Toast recipes&gt;, &lt;Entry: Pizza recipes&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"using-generatedfield\">\n<h3>Using <code class=\"docutils literal notranslate\">GeneratedField</code><a class=\"heading-anchor\" href=\"#using-generatedfield\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>An alternative method is to use a <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/fields/#django.db.models.GeneratedField\" title=\"django.db.models.GeneratedField\"><code class=\"xref py py-class docutils literal notranslate\">GeneratedField</code></a>,\nwhich has PostgreSQL maintain the column rather than a trigger:</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=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.indexes</span> <span class=\"kn\">import</span> GinIndex\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.search</span> <span class=\"kn\">import</span> SearchVector<span class=\"p\">,</span> SearchVectorField\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Entry</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    headline <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">255</span><span class=\"p\">)</span>\n    body_text <span class=\"o\">=</span> models<span class=\"o\">.</span>TextField<span class=\"p\">()</span>\n\n    search_vector <span class=\"o\">=</span> models<span class=\"o\">.</span>GeneratedField<span class=\"p\">(</span>\n        expression<span class=\"o\">=</span>SearchVector<span class=\"p\">(</span><span class=\"s2\">&quot;headline&quot;</span><span class=\"p\">,</span> weight<span class=\"o\">=</span><span class=\"s2\">&quot;A&quot;</span><span class=\"p\">,</span> config<span class=\"o\">=</span><span class=\"s2\">&quot;english&quot;</span><span class=\"p\">)</span>\n        <span class=\"o\">+</span> SearchVector<span class=\"p\">(</span><span class=\"s2\">&quot;body_text&quot;</span><span class=\"p\">,</span> weight<span class=\"o\">=</span><span class=\"s2\">&quot;B&quot;</span><span class=\"p\">,</span> config<span class=\"o\">=</span><span class=\"s2\">&quot;english&quot;</span><span class=\"p\">),</span>\n        output_field<span class=\"o\">=</span>SearchVectorField<span class=\"p\">(),</span>\n        db_persist<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        indexes <span class=\"o\">=</span> <span class=\"p\">[</span>GinIndex<span class=\"p\">(</span>fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;search_vector&quot;</span><span class=\"p\">])]</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"trigram-similarity\">\n<h2>三元相似度<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>另一种搜索的方法是三字母相似度。三字母是指三个连续的字符组合。除了 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/postgres/lookups/#std-fieldlookup-trigram_similar\"><code class=\"xref std std-lookup docutils literal notranslate\">trigram_similar</code></a>、<a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/postgres/lookups/#std-fieldlookup-trigram_word_similar\"><code class=\"xref std std-lookup docutils literal notranslate\">trigram_word_similar</code></a> 和 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/postgres/lookups/#std-fieldlookup-trigram_strict_word_similar\"><code class=\"xref std std-lookup docutils literal notranslate\">trigram_strict_word_similar</code></a> 查找之外，您还可以使用一些其他表达式。</p>\n<p>要使用它们，你需要激活 PostgreSQL 上的 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/pgtrgm.html\">pg_trgm 扩展</a> 。你可以使用 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/contrib/postgres/operations/#django.contrib.postgres.operations.TrigramExtension\" title=\"django.contrib.postgres.operations.TrigramExtension\"><code class=\"xref py py-class docutils literal notranslate\">TrigramExtension</code></a> 迁移操作来安装它。</p>\n<section id=\"trigramsimilarity\">\n<h3><code class=\"docutils literal notranslate\">TrigramSimilarity</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\">class</span> </em><span class=\"sig-name descname\">TrigramSimilarity</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</em>, <em class=\"sig-param\">string</em>, <em class=\"sig-param\"><span class=\"o\">**</span>extra</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>接受一个字段名或表达式，以及一个字符串或表达式。返回两个参数之间的三元相似度。</p>\n<p>用法示例：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.search</span> <span class=\"kn\">import</span> TrigramSimilarity\n<span class=\"gp\">&gt;&gt;&gt; </span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Katy Stevens&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Stephen Keats&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>test <span class=\"o\">=</span> <span class=\"s2\">&quot;Katie Stephens&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    similarity<span class=\"o\">=</span>TrigramSimilarity<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> test<span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    similarity__gt<span class=\"o\">=</span><span class=\"mf\">0.3</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;-similarity&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Author: Katy Stevens&gt;, &lt;Author: Stephen Keats&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"trigramwordsimilarity\">\n<h3><code class=\"docutils literal notranslate\">TrigramWordSimilarity</code><a class=\"heading-anchor\" href=\"#trigramwordsimilarity\"><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.TrigramWordSimilarity\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">TrigramWordSimilarity</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">string</em>, <em class=\"sig-param\">expression</em>, <em class=\"sig-param\"><span class=\"o\">**</span>extra</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.search.TrigramWordSimilarity\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>接受一个字符串或表达式，以及一个字段名或表达式。返回两个参数之间的三元相似度。</p>\n<p>用法示例：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.search</span> <span class=\"kn\">import</span> TrigramWordSimilarity\n<span class=\"gp\">&gt;&gt;&gt; </span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Katy Stevens&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Stephen Keats&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>test <span class=\"o\">=</span> <span class=\"s2\">&quot;Kat&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    similarity<span class=\"o\">=</span>TrigramWordSimilarity<span class=\"p\">(</span>test<span class=\"p\">,</span> <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    similarity__gt<span class=\"o\">=</span><span class=\"mf\">0.3</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;-similarity&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Author: Katy Stevens&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"trigramstrictwordsimilarity\">\n<h3><code class=\"docutils literal notranslate\">TrigramStrictWordSimilarity</code><a class=\"heading-anchor\" href=\"#trigramstrictwordsimilarity\"><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.TrigramStrictWordSimilarity\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">TrigramStrictWordSimilarity</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">string</em>, <em class=\"sig-param\">expression</em>, <em class=\"sig-param\"><span class=\"o\">**</span>extra</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.search.TrigramStrictWordSimilarity\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>接受一个字符串或表达式，以及一个字段名或表达式。返回两个参数之间的三字母严格单词相似度。类似于 <a class=\"reference internal\" href=\"#django.contrib.postgres.search.TrigramWordSimilarity\" title=\"django.contrib.postgres.search.TrigramWordSimilarity\"><code class=\"xref py py-class docutils literal notranslate\">TrigramWordSimilarity()</code></a>，但它强制范围边界与单词边界匹配。</p>\n</section>\n<section id=\"trigramdistance\">\n<h3><code class=\"docutils literal notranslate\">TrigramDistance</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\">class</span> </em><span class=\"sig-name descname\">TrigramDistance</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">expression</em>, <em class=\"sig-param\">string</em>, <em class=\"sig-param\"><span class=\"o\">**</span>extra</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>接受一个字段名或表达式，以及一个字符串或表达式。返回两个参数之间的三元距离。</p>\n<p>用法示例：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.search</span> <span class=\"kn\">import</span> TrigramDistance\n<span class=\"gp\">&gt;&gt;&gt; </span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Katy Stevens&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Stephen Keats&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>test <span class=\"o\">=</span> <span class=\"s2\">&quot;Katie Stephens&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    distance<span class=\"o\">=</span>TrigramDistance<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">,</span> test<span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    distance__lte<span class=\"o\">=</span><span class=\"mf\">0.7</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;distance&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Author: Katy Stevens&gt;, &lt;Author: Stephen Keats&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"trigramworddistance\">\n<h3><code class=\"docutils literal notranslate\">TrigramWordDistance</code><a class=\"heading-anchor\" href=\"#trigramworddistance\"><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.TrigramWordDistance\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">TrigramWordDistance</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">string</em>, <em class=\"sig-param\">expression</em>, <em class=\"sig-param\"><span class=\"o\">**</span>extra</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.search.TrigramWordDistance\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>接受一个字符串或表达式，以及一个字段名或表达式。返回两个参数之间的三元字距离。</p>\n<p>用法示例：</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.search</span> <span class=\"kn\">import</span> TrigramWordDistance\n<span class=\"gp\">&gt;&gt;&gt; </span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Katy Stevens&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>create<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;Stephen Keats&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>test <span class=\"o\">=</span> <span class=\"s2\">&quot;Kat&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>Author<span class=\"o\">.</span>objects<span class=\"o\">.</span>annotate<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    distance<span class=\"o\">=</span>TrigramWordDistance<span class=\"p\">(</span>test<span class=\"p\">,</span> <span class=\"s2\">&quot;name&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>filter<span class=\"p\">(</span>\n<span class=\"gp\">... </span>    distance__lte<span class=\"o\">=</span><span class=\"mf\">0.7</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span>order_by<span class=\"p\">(</span><span class=\"s2\">&quot;distance&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;Author: Katy Stevens&gt;]&gt;</span>\n</code></pre></div>\n</section>\n<section id=\"trigramstrictworddistance\">\n<h3><code class=\"docutils literal notranslate\">TrigramStrictWordDistance</code><a class=\"heading-anchor\" href=\"#trigramstrictworddistance\"><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.TrigramStrictWordDistance\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">TrigramStrictWordDistance</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">string</em>, <em class=\"sig-param\">expression</em>, <em class=\"sig-param\"><span class=\"o\">**</span>extra</em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.search.TrigramStrictWordDistance\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>接受一个字符串或表达式，以及一个字段名或表达式。返回两个参数之间的三字母严格单词距离。</p>\n</section>\n</section>","rootId":"full-text-search","toc":[{"title":"search 查找","anchor":"the-search-lookup","children":[]},{"title":"SearchVector","anchor":"searchvector","children":[]},{"title":"SearchQuery","anchor":"searchquery","children":[]},{"title":"SearchRank","anchor":"searchrank","children":[]},{"title":"SearchHeadline","anchor":"searchheadline","children":[]},{"title":"更改搜索配置","anchor":"changing-the-search-configuration","children":[]},{"title":"加权查询","anchor":"weighting-queries","children":[]},{"title":"Lexeme","anchor":"lexeme","children":[]},{"title":"性能","anchor":"performance","children":[{"title":"SearchVectorField","anchor":"searchvectorfield","children":[]},{"title":"Using GeneratedField","anchor":"using-generatedfield","children":[]}]},{"title":"三元相似度","anchor":"trigram-similarity","children":[{"title":"TrigramSimilarity","anchor":"trigramsimilarity","children":[]},{"title":"TrigramWordSimilarity","anchor":"trigramwordsimilarity","children":[]},{"title":"TrigramStrictWordSimilarity","anchor":"trigramstrictwordsimilarity","children":[]},{"title":"TrigramDistance","anchor":"trigramdistance","children":[]},{"title":"TrigramWordDistance","anchor":"trigramworddistance","children":[]},{"title":"TrigramStrictWordDistance","anchor":"trigramstrictworddistance","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/6.1/ref/"},{"docname":"ref/contrib/index","title":"contrib 包","url":"/zh-hans/6.1/ref/contrib/"},{"docname":"ref/contrib/postgres/index","title":"django.contrib.postgres","url":"/zh-hans/6.1/ref/contrib/postgres/"}],"prev":{"docname":"ref/contrib/postgres/operations","title":"数据库迁移操作","url":"/zh-hans/6.1/ref/contrib/postgres/operations/"},"next":{"docname":"ref/contrib/postgres/validators","title":"验证器","url":"/zh-hans/6.1/ref/contrib/postgres/validators/"},"formats":{"html":"/zh-hans/6.1/ref/contrib/postgres/search/","markdown":"/zh-hans/6.1/ref/contrib/postgres/search.md","json":"/zh-hans/6.1/ref/contrib/postgres/search.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/ref/contrib/postgres/search.txt","official":"https://docs.djangoproject.com/zh-hans/6.1/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"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}