{"title":"Sök","version":"5.2","locale":"sv","docname":"topics/db/search","url":"/sv/5.2/topics/db/search/","canonical":"https://djangodocs.dev/sv/5.2/topics/db/search/","summary":"En vanlig uppgift för webbapplikationer är att söka efter data i databasen med hjälp av användarinmatning. I ett enkelt fall kan det handla om att filtrera en lista…","html":"<h1>Sök<a class=\"heading-anchor\" href=\"#search\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>En vanlig uppgift för webbapplikationer är att söka efter data i databasen med hjälp av användarinmatning. I ett enkelt fall kan det handla om att filtrera en lista med objekt efter en kategori. Ett mer komplext användningsfall kan kräva sökning med viktning, kategorisering, markering, flera språk och så vidare. I det här dokumentet beskrivs några av de möjliga användningsområdena och de verktyg som du kan använda.</p>\n<p>Vi kommer att hänvisa till samma modeller som används i <a class=\"reference internal\" href=\"/sv/5.2/topics/db/queries/\"><span class=\"doc\">Göra förfrågningar</span></a>.</p>\n<section id=\"use-cases\">\n<h2>Användningsfall<a class=\"heading-anchor\" href=\"#use-cases\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"standard-textual-queries\">\n<h3>Standardiserade textförfrågningar<a class=\"heading-anchor\" href=\"#standard-textual-queries\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Textbaserade fält har ett urval av matchningsoperationer. Du kanske till exempel vill tillåta uppslagning av en författare på följande sätt:</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=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__contains</span><span class=\"o\">=</span><span class=\"s2\">&quot;Terry&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[&lt;Author: Terry Gilliam&gt;, &lt;Author: Terry Jones&gt;]</span>\n</code></pre></div>\n<p>Det här är en mycket bräcklig lösning eftersom den kräver att användaren känner till en exakt delsträng av författarens namn. En bättre metod skulle kunna vara en matchning utan skiftlägeskänslighet (<a class=\"reference internal\" href=\"/sv/5.2/ref/models/querysets/#std-fieldlookup-icontains\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">icontains</span></code></a>), men det är bara marginellt bättre.</p>\n</section>\n<section id=\"a-database-s-more-advanced-comparison-functions\">\n<h3>En databases mer avancerade jämförelsefunktioner<a class=\"heading-anchor\" href=\"#a-database-s-more-advanced-comparison-functions\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Om du använder PostgreSQL tillhandahåller Django <a class=\"reference internal\" href=\"/sv/5.2/ref/contrib/postgres/search/\"><span class=\"doc\">ett urval av databasspecifika verktyg</span></a> så att du kan utnyttja mer komplexa frågealternativ. Andra databaser har olika urval av verktyg, eventuellt via plugins eller användardefinierade funktioner. Django inkluderar inget stöd för dem just nu. Vi kommer att använda några exempel från PostgreSQL för att visa vilken typ av funktionalitet databaser kan ha.</p>\n<aside class=\"admonition-searching-in-other-databases admonition\">\n<p class=\"admonition-title\">Sökning i andra databaser</p>\n<p>Alla sökverktyg som tillhandahålls av <a class=\"reference internal\" href=\"/sv/5.2/ref/contrib/postgres/#module-django.contrib.postgres\" title=\"django.contrib.postgres: PostgreSQL-specific fields and features\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.postgres</span></code></a> är helt konstruerade på offentliga API:er som <a class=\"reference internal\" href=\"/sv/5.2/ref/models/lookups/\"><span class=\"doc\">custom lookups</span></a> och <a class=\"reference internal\" href=\"/sv/5.2/ref/models/database-functions/\"><span class=\"doc\">database functions</span></a>. Beroende på din databas bör du kunna konstruera frågor för att tillåta liknande API:er. Om det finns specifika saker som inte kan uppnås på det här sättet, öppna ett ärende.</p>\n</aside>\n<p>I exemplet ovan kom vi fram till att det vore mer användbart med en jämförelse som inte tar hänsyn till skiftlägesskillnader. När det gäller icke-engelska namn är en ytterligare förbättring att använda <a class=\"reference internal\" href=\"/sv/5.2/ref/contrib/postgres/lookups/#std-fieldlookup-unaccent\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">unaccented</span> <span class=\"pre\">comparison</span></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><span class=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__unaccent__icontains</span><span class=\"o\">=</span><span class=\"s2\">&quot;Helen&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[&lt;Author: Helen Mirren&gt;, &lt;Author: Helena Bonham Carter&gt;, &lt;Author: Hélène Joy&gt;]</span>\n</code></pre></div>\n<p>Detta visar ett annat problem, där vi matchar mot en annan stavning av namnet. I det här fallet har vi dock en asymmetri - en sökning efter <code class=\"docutils literal notranslate\"><span class=\"pre\">Helen</span></code> kommer att ge <code class=\"docutils literal notranslate\"><span class=\"pre\">Helena</span></code> eller <code class=\"docutils literal notranslate\"><span class=\"pre\">Hélène</span></code>, men inte tvärtom. Ett annat alternativ skulle vara att använda en <a class=\"reference internal\" href=\"/sv/5.2/ref/contrib/postgres/lookups/#std-fieldlookup-trigram_similar\"><code class=\"xref std std-lookup docutils literal notranslate\"><span class=\"pre\">trigram_similar</span></code></a>-jämförelse, som jämför sekvenser av bokstäver.</p>\n<p>Till exempel:</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=\"n\">Author</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">name__unaccent__lower__trigram_similar</span><span class=\"o\">=</span><span class=\"s2\">&quot;Hélène&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[&lt;Author: Helen Mirren&gt;, &lt;Author: Hélène Joy&gt;]</span>\n</code></pre></div>\n<p>Nu har vi ett annat problem - det längre namnet ”Helena Bonham Carter” dyker inte upp eftersom det är mycket längre. Trigramsökningar tar hänsyn till alla kombinationer av tre bokstäver och jämför hur många som förekommer i både sök- och källsträngarna. För det längre namnet finns det fler kombinationer som inte förekommer i källsträngen, så det anses inte längre vara en nära matchning.</p>\n<p>Det korrekta valet av jämförelsefunktioner här beror på din specifika datauppsättning, till exempel det eller de språk som används och den typ av text som söks. Alla de exempel vi har sett gäller korta strängar där användaren sannolikt kommer att skriva in något som ligger nära (med olika definitioner) källdata.</p>\n</section>\n<section id=\"document-based-search\">\n<h3>Dokumentbaserad sökning<a class=\"heading-anchor\" href=\"#document-based-search\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Standardoperationer i databaser slutar att vara en användbar metod när man börjar titta på stora textblock. Medan exemplen ovan kan ses som operationer på en sträng med tecken, tittar fulltextsökning på de faktiska orden. Beroende på vilket system som används är det troligt att det använder några av följande idéer:</p>\n<ul class=\"simple\">\n<li><p>Ignorera ”stoppord” som ”en”, ”den”, ”och”.</p></li>\n<li><p>Stamning av ord, så att ”ponny” och ”ponnyer” anses vara likartade.</p></li>\n<li><p>Viktning av ord baserat på olika kriterier, t.ex. hur ofta de förekommer i texten eller hur viktiga de fält är som de förekommer i, t.ex. titel eller nyckelord.</p></li>\n</ul>\n<p>Det finns många alternativ till att använda sökprogramvara, några av de mest framträdande är <a class=\"reference external\" href=\"https://www.elastic.co/\">Elastic</a> och <a class=\"reference external\" href=\"https://solr.apache.org/\">Solr</a>. Dessa är fullständiga dokumentbaserade söklösningar. För att använda dem med data från Django-modeller behöver du ett lager som översätter dina data till ett textdokument, inklusive backreferenser till databas-ID:n. När en sökning med hjälp av motorn returnerar ett visst dokument kan du sedan slå upp det i databasen. Det finns en mängd olika tredjepartsbibliotek som är utformade för att hjälpa till med denna process.</p>\n<section id=\"postgresql-support\">\n<h4>Stöd för PostgreSQL<a class=\"heading-anchor\" href=\"#postgresql-support\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>PostgreSQL har sin egen inbyggda implementering av fulltextsökning. Även om det inte är lika kraftfullt som vissa andra sökmotorer, har det fördelen att det finns i din databas och så kan det enkelt kombineras med andra relationsfrågor som kategorisering.</p>\n<p>Modulen <a class=\"reference internal\" href=\"/sv/5.2/ref/contrib/postgres/#module-django.contrib.postgres\" title=\"django.contrib.postgres: PostgreSQL-specific fields and features\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.postgres</span></code></a> tillhandahåller några hjälpmedel för att göra dessa frågor. Till exempel kan en fråga välja alla blogginlägg som nämner ”ost”:</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=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">body_text__search</span><span class=\"o\">=</span><span class=\"s2\">&quot;cheese&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[&lt;Entry: Cheese on Toast recipes&gt;, &lt;Entry: Pizza recipes&gt;]</span>\n</code></pre></div>\n<p>Du kan också filtrera på en kombination av fält och på relaterade modeller:</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=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">annotate</span><span class=\"p\">(</span>\n<span class=\"gp\">... </span>    <span class=\"n\">search</span><span class=\"o\">=</span><span class=\"n\">SearchVector</span><span class=\"p\">(</span><span class=\"s2\">&quot;blog__tagline&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;body_text&quot;</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">search</span><span class=\"o\">=</span><span class=\"s2\">&quot;cheese&quot;</span><span class=\"p\">)</span>\n<span class=\"go\">[</span>\n<span class=\"go\">    &lt;Entry: Cheese on Toast recipes&gt;,</span>\n<span class=\"go\">    &lt;Entry: Pizza Recipes&gt;,</span>\n<span class=\"go\">    &lt;Entry: Dairy farming in Argentina&gt;,</span>\n<span class=\"go\">]</span>\n</code></pre></div>\n<p>Se dokumentet <code class=\"docutils literal notranslate\"><span class=\"pre\">contrib.postgres</span></code> <a class=\"reference internal\" href=\"/sv/5.2/ref/contrib/postgres/search/\"><span class=\"doc\">Fulltextsökning</span></a> för fullständig information.</p>\n</section>\n</section>\n</section>","rootId":"search","toc":[{"title":"Användningsfall","anchor":"use-cases","children":[{"title":"Standardiserade textförfrågningar","anchor":"standard-textual-queries","children":[]},{"title":"En databases mer avancerade jämförelsefunktioner","anchor":"a-database-s-more-advanced-comparison-functions","children":[]},{"title":"Dokumentbaserad sökning","anchor":"document-based-search","children":[{"title":"Stöd för PostgreSQL","anchor":"postgresql-support","children":[]}]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Använda Django","url":"/sv/5.2/topics/"},{"docname":"topics/db/index","title":"Modeller och databaser","url":"/sv/5.2/topics/db/"}],"prev":{"docname":"topics/db/aggregation","title":"Aggregering","url":"/sv/5.2/topics/db/aggregation/"},"next":{"docname":"topics/db/managers","title":"Ansvariga","url":"/sv/5.2/topics/db/managers/"},"formats":{"html":"/sv/5.2/topics/db/search/","markdown":"/sv/5.2/topics/db/search.md","json":"/sv/5.2/topics/db/search.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/topics/db/search.txt","official":"https://docs.djangoproject.com/sv/5.2/topics/db/search/","inVersions":["6.1","6.0","5.2"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}