Skip to content

djangodocs

Django 3.0
  • 6.1 current
  • 6.0
  • 5.2 LTS
  • 5.1 unsupported
  • 5.0 unsupported
  • 4.2 unsupported
  • 4.1 unsupported
  • 4.0 unsupported
  • 3.2 unsupported
  • 3.1 unsupported
  • 3.0 unsupported
  • 2.2 unsupported
  • 2.1 unsupported
  • 2.0 unsupported
  • 1.11 unsupported
  • 1.10 unsupported
  • 1.9 unsupported
日本語
  • English
  • 简体中文
  • Français
  • 日本語
  • Bahasa Indonesia
  • Português (Brasil)
  • 한국어
  • Español
  • Ελληνικά
  • Polski
Documentation contents
  • Django ドキュメント
  • さぁ始めましょう
  • Django を使う
    • Django のインストール方法
    • モデルとデータベース
      • モデル
      • クエリを作成する
      • アグリゲーション
      • 検索
      • マネージャ
      • 素の SQL 文の実行
      • データベースのトランザクション
      • 複数のデータベース
      • Tablespaces
      • データベースアクセスの最適化
      • Database instrumentation
      • Examples of model relationship API usage
    • HTTP リクエストのハンドリング
    • フォームを使う
    • テンプレート
    • クラスベースビュー
    • マイグレーション
    • ファイルの管理
    • Django におけるテスト
    • Django でのユーザー認証
    • Django's cache framework
    • 条件付きビュー
    • 暗号署名
    • メールを送信する
    • 国際化とローカル化
    • ロギング
    • ページネーション
    • Django におけるセキュリティ
    • パフォーマンスと最適化
    • Django オブジェクトのシリアル化
    • Djangoの設定
    • Signals
    • System check framework
    • External packages
    • 非同期サポート
  • 「How-to」ガイド
  • Django FAQ よくある質問
  • API Reference
  • メタドキュメントとその他
  • 用語集
  • リリースノート
  • Django internals
Django 3.0 is no longer supported. It receives no security fixes. Use it for reference only. Latest release
Japanese translation. Untranslated passages appear in English. 33.9% Help translate
  1. Django 3.0
  2. Django を使う
  3. モデルとデータベース

検索Link to this heading#

ウェブアプリケーションの一般的なタスクは、ユーザーからの入力を用いてデータベース内のデータを検索することです。簡単なケースなら、オブジェクトのリストをカテゴリごとにフィルタリングすることで実現できるかもしれません。しかし、もっと複雑なユースケースでは、重み付き検索、カテゴリー分け、ハイライト、複数言語対応などが必要になることもあります。このドキュメントでは、そのようなユースケースについて説明するとともに、利用できるツールを紹介します。

ここでは クエリを作成する で使われたのと同じモデルを使って説明します。

ユースケースLink to this heading#

標準的なテキストのクエリLink to this heading#

Text-based fields have a selection of matching operations. For example, you may wish to allow lookup up an author like so:

Code
>>> Author.objects.filter(name__contains='Terry')
[<Author: Terry Gilliam>, <Author: Terry Jones>]

これは非常に弱い解決方法です。なぜなら、ユーザーが著者名の正確な部分文字列を知っている必要があるからです。case-insensitive なマッチ (icontains) を利用すれば少しはましになりますが、ほとんど違いはありません。

データベースが持つ高度な比較関数Link to this heading#

If you're using PostgreSQL, Django provides a selection of database specific tools to allow you to leverage more complex querying options. Other databases have different selections of tools, possibly via plugins or user-defined functions. Django doesn't include any support for them at this time. We'll use some examples from PostgreSQL to demonstrate the kind of functionality databases may have.

Searching in other databases

All of the searching tools provided by django.contrib.postgres are constructed entirely on public APIs such as custom lookups and database functions. Depending on your database, you should be able to construct queries to allow similar APIs. If there are specific things which cannot be achieved this way, please open a ticket.

In the above example, we determined that a case insensitive lookup would be more useful. When dealing with non-English names, a further improvement is to use unaccented comparison:

Code
>>> Author.objects.filter(name__unaccent__icontains='Helen')
[<Author: Helen Mirren>, <Author: Helena Bonham Carter>, <Author: Hélène Joy>]

This shows another issue, where we are matching against a different spelling of the name. In this case we have an asymmetry though - a search for Helen will pick up Helena or Hélène, but not the reverse. Another option would be to use a trigram_similar comparison, which compares sequences of letters.

例:

Code
>>> Author.objects.filter(name__unaccent__lower__trigram_similar='Hélène')
[<Author: Helen Mirren>, <Author: Hélène Joy>]

Now we have a different problem - the longer name of "Helena Bonham Carter" doesn't show up as it is much longer. Trigram searches consider all combinations of three letters, and compares how many appear in both search and source strings. For the longer name, there are more combinations which appear in the source string so it is no longer considered a close match.

The correct choice of comparison functions here depends on your particular data set, for example the language(s) used and the type of text being searched. All of the examples we've seen are on short strings where the user is likely to enter something close (by varying definitions) to the source data.

文書ベースの検索Link to this heading#

Standard database operations stop being a useful approach when you start considering large blocks of text. Whereas the examples above can be thought of as operations on a string of characters, full text search looks at the actual words. Depending on the system used, it's likely to use some of the following ideas:

  • Ignoring "stop words" such as "a", "the", "and".

  • Stemming words, so that "pony" and "ponies" are considered similar.

  • Weighting words based on different criteria such as how frequently they appear in the text, or the importance of the fields, such as the title or keywords, that they appear in.

There are many alternatives for using searching software, some of the most prominent are Elastic and Solr. These are full document-based search solutions. To use them with data from Django models, you'll need a layer which translates your data into a textual document, including back-references to the database ids. When a search using the engine returns a certain document, you can then look it up in the database. There are a variety of third-party libraries which are designed to help with this process.

PostgreSQL のサポートLink to this heading#

PostgreSQL has its own full text search implementation built-in. While not as powerful as some other search engines, it has the advantage of being inside your database and so can easily be combined with other relational queries such as categorization.

The django.contrib.postgres module provides some helpers to make these queries. For example, a query might select all the blog entries which mention "cheese":

Code
>>> Entry.objects.filter(body_text__search='cheese')
[<Entry: Cheese on Toast recipes>, <Entry: Pizza recipes>]

You can also filter on a combination of fields and on related models:

Code
>>> Entry.objects.annotate(
...     search=SearchVector('blog__tagline', 'body_text'),
... ).filter(search='cheese')
[
    <Entry: Cheese on Toast recipes>,
    <Entry: Pizza Recipes>,
    <Entry: Dairy farming in Argentina>,
]

See the contrib.postgres Full text search document for complete details.

View as Markdown Edit this page on GitHub Official version
Previousアグリゲーション Nextマネージャ

On this page

  • ユースケース
    • 標準的なテキストのクエリ
    • データベースが持つ高度な比較関数
    • 文書ベースの検索
      • PostgreSQL のサポート

An unofficial rendering of the Django documentation.

Not affiliated with or endorsed by the Django Software Foundation. The documentation is copyright © Django Software Foundation and individual contributors, and is used under the BSD 3-Clause licence. “Django” is a trademark of the Django Software Foundation.

This translation is the work of the Django i18n community, not of this site. Read the official documentation at docs.djangoproject.com.

👋 Jason Cartwright