{"title":"全文搜索","version":"5.2","locale":"zh-hans","docname":"ref/contrib/postgres/search","url":"/zh-hans/5.2/ref/contrib/postgres/search/","canonical":"https://djangodocs.dev/zh-hans/5.2/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/5.2/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/5.2/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/5.2/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/5.2/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\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</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</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=\"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>如果您查询的所有字段都包含在一个特定的模型中，您可以创建一个与您希望使用的搜索向量匹配的功能性 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/contrib/postgres/indexes/#django.contrib.postgres.indexes.GinIndex\" title=\"django.contrib.postgres.indexes.GinIndex\"><code class=\"xref py py-class docutils literal notranslate\">GIN</code></a> 或 <a class=\"reference internal\" href=\"/zh-hans/5.2/ref/contrib/postgres/indexes/#django.contrib.postgres.indexes.GistIndex\" title=\"django.contrib.postgres.indexes.GistIndex\"><code class=\"xref py py-class docutils literal notranslate\">GiST</code></a> 索引。例如：</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>PostgreSQL 文档详细介绍了如何为全文搜索创建索引，您可以查看 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/textsearch-tables.html#TEXTSEARCH-TABLES-INDEX\">创建全文搜索索引的 PostgreSQL 文档</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>\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/5.2/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/5.2/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/5.2/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/5.2/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":"性能","anchor":"performance","children":[{"title":"SearchVectorField","anchor":"searchvectorfield","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/5.2/ref/"},{"docname":"ref/contrib/index","title":"contrib 包","url":"/zh-hans/5.2/ref/contrib/"},{"docname":"ref/contrib/postgres/index","title":"django.contrib.postgres","url":"/zh-hans/5.2/ref/contrib/postgres/"}],"prev":{"docname":"ref/contrib/postgres/operations","title":"数据库迁移操作","url":"/zh-hans/5.2/ref/contrib/postgres/operations/"},"next":{"docname":"ref/contrib/postgres/validators","title":"验证器","url":"/zh-hans/5.2/ref/contrib/postgres/validators/"},"formats":{"html":"/zh-hans/5.2/ref/contrib/postgres/search/","markdown":"/zh-hans/5.2/ref/contrib/postgres/search.md","json":"/zh-hans/5.2/ref/contrib/postgres/search.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/ref/contrib/postgres/search.txt","official":"https://docs.djangoproject.com/zh-hans/5.2/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"]}