Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/ / /
Diango MongoDBバックエンド
/

Atlas Search クエリの実行

このガイドでは、Diango MongoDBバックエンドを使用してコレクションに対して Atlas Search クエリを実行する方法を説明します。Atlas Search を使用すると、 MongoDB Atlasでホストされているコレクションに対して全文検索を実行できます。Atlas Search インデックスは、検索の動作とインデックスするフィールド を指定します。

このガイドの例では、Atlasサンプルデータセットsample_mflix.movies コレクションと sample_mflix.theaters コレクションを表す Movie モデルと Theater モデルを使用します。モデル クラスには、次の定義があります。

from django.db import models
from django.contrib.gis.db import models
from django_mongodb_backend.fields import ArrayField
class Movie(models.Model):
title = models.CharField(max_length=200)
plot = models.TextField(blank=True)
runtime = models.IntegerField(default=0)
genres = ArrayField(models.CharField(max_length=100), null=True, blank=True)
class Meta:
db_table = "movies"
managed = False
def __str__(self):
return self.title
class Theater(models.Model):
theater_id = models.IntegerField(default=0, db_column="theaterId")
geo = models.PointField(db_column="location.geo")
class Meta:
db_table = "theaters"
managed = False
def __str__(self):
return self.theater_id

Tip

GeoDiango フィールド

Theaterモデルでは、地理空間データを保存するために、 という名前の GeoDiangoPointField geoを使用します。 GeoDiango フィールドの詳細については、 モデル地理空間データガイドをご覧ください。

Movie モデルと Theater モデルには、モデルメタデータを指定する内部 Metaクラスと、モデルの string 表現を定義する __str__() メソッドが含まれています。 これらのモデル機能の詳細については、「 モデルの作成ガイドの モデルの定義 」を参照してください。

Pythonインタラクティブシェル を使用してコード例を実行できます。 シェルを入力するには、プロジェクトの ルートディレクトリから次のコマンドを実行します。

python manage.py shell

Python シェルを入力したら、次のモデルとモジュールをインポートしていることを確認します。

from <your application name>.models import Movie, Theater
from django_mongodb_backend.expressions import (
SearchEquals, SearchAutocomplete, SearchExists, SearchIn,
SearchPhrase, SearchQueryString, SearchRange, SearchRegex,
SearchText, SearchWildcard, SearchGeoShape, SearchGeoWithin,
SearchMoreLikeThis, CompoundExpression, SearchScoreOption
)

Movie モデルとPython対話型シェル を使用してMongoDBドキュメントを操作する Dlangoアプリケーションを作成する方法については、使い始める チュートリアルをご覧ください。

重要

インデックスの要件

Atlas Search クエリを実行中前に、関連するフィールドに Atlas Searchインデックスを作成する必要があります。Atlas Search インデックスの作成方法については、 インデックスの作成ガイドの「Atlas Search インデックス」を参照してください。

Atlas Search クエリを実行するには、Diango の QuerySet APIの annotate() メソッドを使用します。検索演算子を含む Atlas Search 条件を、annotate() への score 引数として渡します。次のコードは、Atlas Search クエリを実行中ための基本的な構文を示しています。

Model.objects.annotate(
score=<Search Operator>(path="<field name", <additional arguments>)
)

Atlas Search 演算子を指定するには、django_mongodb_backend.expressions モジュールが提供する式クラス を使用します。各クラスは、Atlas Search 演算子に対応します。

次のセクションでは、サポートされている各式クラスを使用して Atlas Search クエリを実行する方法を示します。

重要

追加のインデックス要件

Atlas Search クエリで SearchEquals式を使用する前に、関連するフィールドをトークンタイプとしてインデックス化する Atlas Searchインデックスを作成します。Dlango MongoDBバックエンドの SearchIndexクラスを使用してこのインデックスを作成することはできませんが、MongoClient で直接操作することでPyMongoドライバー メソッドを使用できます。詳細については、 「未加工データベースクエリの実行」ガイドの 「MongoClient 操作」 を参照してください。

SearchEquals式は、フィールドが指定された値と等しいドキュメントに一致します。これはMongoDB のequals 演算子に相当します。

この演算子を使用するには、次の引数を SearchEquals() コンストラクターに渡します。

  • path: The name of the field to search. You can specify a string value or a F instance.

  • value: The value to match. You can specify a string value or a Value instance.

  • score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。

次の例では、SearchEquals 演算子を使用して、sample_mflix.moviesコレクションで title の値が "Finding Nemo" であるドキュメントをクエリします。

Movie.objects.annotate(score=SearchEquals(path="title", value="Finding Nemo"))

重要

追加のインデックス要件

Atlas Search クエリで SearchAutocomplete式を使用する前に、関連するフィールドを オートコンプリート タイプ としてインデックスを作成する Atlas Searchインデックスを作成します。Dlango MongoDBバックエンドの SearchIndexクラスを使用してこのインデックスを作成することはできませんが、MongoClient で直接操作することでPyMongoドライバー メソッドを使用できます。詳細については、 「未加工データベースクエリの実行」ガイドの 「MongoClient 操作」 を参照してください。

SearchAutocomplete式は、不完全な入力 string からの文字シーケンスを含む または 単語のフレーズを検索します。これはMongoDB のオートコンプリート 演算子に相当します。

この演算子を使用するには、次の引数を SearchAutocomplete() コンストラクターに渡します。

  • path: The name of the field to search. You can specify a string value or a F instance.

  • query: The input string to autocomplete. You can specify a string value or a Value instance.

  • fuzzy : (任意)ファジー一致を有効にし、その動作を構成できる辞書。例、{"maxEdits": 1} と指定すると、検索タームに一致する前に 1 文字の変更を許可できます。使用可能なすべての値を表示するには、 MongoDB Atlasドキュメントの オートコンプリート オプションを参照してください。

  • token_order: (任意) トークン シーケンスの動作を構成する string。この値は "sequential" または "any" に設定できます。

  • score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。

次の例では、SearchAutocomplete式を使用して、sample_mflix.moviesコレクションで "First" で始まる title 値を持つドキュメントをクエリします。

Movie.objects.annotate(score=SearchAutocomplete(path="title", query="First"))

SearchExists式は、指定されたフィールドが存在するドキュメントと一致します。これはMongoDB exists 演算子に対応します。

この演算子を使用するには、次の引数を SearchExists() コンストラクターに渡します。

  • path: The name of the field to match. You can specify a string value or a F instance.

  • score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。

次の例では、SearchExists式を使用して、sample_mflix.moviesコレクションで plotフィールドを持つドキュメントをクエリします。

Movie.objects.annotate(score=SearchExists(path="plot"))

重要

追加のインデックス要件

Atlas Search クエリで SearchIn式を使用する前に、関連するフィールドに Atlas Searchインデックスを作成します。stringフィールドをクエリする場合は、トークン タイプとしてインデックス必要があります。SearchIndexこのインデックスをクラスするにはMongoClient詳細については、 「未加工データベースクエリの実行」ガイドの 「MongoClient 操作」 を参照してください。

SearchIn式は、フィールドの値が特定のリスト内にあるドキュメントと一致します。これはMongoDB in 演算子に対応します。

この演算子を使用するには、次の引数を SearchIn() コンストラクターに渡します。

  • path: The name of the field to search. You can specify a string value or a F instance.

  • value: The list of values to match. You can specify a list of values or a Value instance.

  • score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。

次の例では、SearchIn式を使用して、sample_mflix.moviesコレクションで、runtime 値が 100200、または 300 分であるドキュメントをクエリします。

Movie.objects.annotate(score=SearchIn(path="runtime", value=[100, 200, 300]))

SearchPhrase式は、フィールド内の正確なタームのシーケンスまたはほぼ正確なシーケンスと一致します。これはMongoDB のフレーズ 演算子に相当します。

この演算子を使用するには、次の引数を SearchPhrase() コンストラクターに渡します。

  • path: The name of the field to search. You can specify a string value or a F instance.

  • query: 一致するフレーズ。string または string のリストを指定できます。

  • slop: (任意)フレーズ タームの間に許容されるタームの最大数。

  • synonyms: (任意) Atlas Searchインデックスで定義されているシノニム マッピングの名前。

  • score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。

次の例では、SearchPhrase式を使用して、sample_mflix.moviesコレクションで、plotフィールドにフレーズ "space adventure" を含むドキュメントをクエリします。これらのタームの間には最大 2 単語が含まれます。

Movie.objects.annotate(score=SearchPhrase(path="plot", query="space adventure", slop=2))

SearchQueryString 演算子を使用すると、string フィールドに対してテキスト検索、ワイルドカード、正規式、ファジー検索、範囲検索を実行できます。これはMongoDB queryString 演算子に対応します。

この演算子を使用するには、次の引数を SearchQueryString() コンストラクターに渡します。

  • path: The name of the field to search. You can specify a string value or a F instance.

  • query: The Lucene-style query string. To learn more about Lucene query syntax, see the Apache Lucene documentation.

  • score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。

次の例では、SearchQueryString式を使用して、sample_mflix.moviesコレクション内で plotフィールドで Lucene スタイルのクエリに一致するドキュメントをクエリします。

Movie.objects.annotate(score=SearchQueryString(path="plot", query="romance AND (paris OR tokyo)"))

重要

追加のインデックス要件

Atlas Search クエリで SearchRange式を使用する前に、関連するフィールドに Atlas Searchインデックスを作成します。stringフィールドをクエリする場合は、トークン タイプとしてインデックス必要があります。SearchIndexこのインデックスをクラスするにはMongoClient詳細については、 「未加工データベースクエリの実行」ガイドの 「MongoClient 操作」 を参照してください。

SearchRange式は、指定された範囲内の値を検索します。数値、日付、string、または ObjectId 値の範囲を指定できます。これは、 MongoDB範囲演算子に対応します。

この演算子を使用するには、次の引数を SearchRange() コンストラクターに渡します。

  • path: The name of the field to search. You can specify a string value or a F instance.

  • lt: (任意)排他的上限(<

  • lte: (任意)上限(<=

  • gt: (任意)排他的下限(>

  • gte: (任意) 下限値を含む(>=

  • score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。

次の例では、SearchRange式を使用して、sample_mflix.moviesコレクションで、90 分と 120 分の間の runtime 値を持つドキュメントをクエリします。

Movie.objects.annotate(score=SearchRange(path="runtime", gt=90, lt=120))

SearchRegex式は、正規式を使用して文字列フィールド値と一致します。 これはMongoDB正規表現演算子に対応します。

この演算子を使用するには、次の引数を SearchRegex() コンストラクターに渡します。

  • path: The name of the field to search. You can specify a string value or a F instance.

  • query:フィールドの内容を検索するために使用される正規式文字列。

  • allow_analyzed_field: (任意)分析されたフィールドとの一致を許可するかどうかを示すブール値値。デフォルト値は False です。

  • score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。

次の例では、SearchRegex式を使用して、sample_mflix.moviesコレクション内で "winter" という単語を含む title 値を持つドキュメントをクエリします。

Movie.objects.annotate(score=SearchRegex(path="title", query=r".*winter.*"))

SearchText式は、string フィールドに対して全文検索を実行します。これはMongoDBテキスト演算子に対応します。

この演算子を使用するには、次の引数を SearchText() コンストラクターに渡します。

  • path: The name of the field to search. You can specify a string value or a F instance.

  • query: 検索タームまたはフレーズ。

  • fuzzy : (任意)ファジー一致を有効にし、その動作を構成できる辞書。例、{"maxEdits": 1} と指定すると、検索タームに一致する前に 1 文字の変更を許可できます。

  • match_criteria: (任意)検索タームの "all" または "any" を含むドキュメントを照合するかどうか。デフォルト値は "any" です。

  • synonyms: (任意) Atlasインデックスで定義されているシノニム マッピングの名前。

  • score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。

次の例では、SearchText式を使用して、sample_mflix.moviesコレクションで、plotフィールドに "sudden disappearance" を持ち、ファジー一致が有効になっているドキュメントをクエリします。

Movie.objects.annotate(score=SearchText(
path="plot",
query="sudden disappearance",
fuzzy={"maxEdits": 2},
match_criteria="all"
))

SearchWildcard式は、ワイルドカード パターンを使用して string と一致します。これは、 MongoDBワイルドカード演算子に対応します。

この演算子を使用するには、次の引数を SearchWildcard() コンストラクターに渡します。

  • path: The name of the field to search. You can specify a string value or a F instance.

  • query: 任意の文字シーケンスに一致するように * 文字を含め、任意の 1 文字を一致させるために ? 文字を含めることができるワイルドカード文字列。

  • allow_analyzed_field: (任意)分析されたフィールドとの一致を可能にするブール値値。デフォルト値は False です。

  • score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。

次の例では、SearchWildcard式を使用して、sample_mflix.moviesコレクションで、"Star" で始まり、任意の文字で終わる title を持つドキュメントをクエリします。

Movie.objects.annotate(score=SearchWildcard(path="title", query="Star*"))

重要

追加のインデックス要件

SearchGeoShapeAtlas Search クエリで 式を使用する前に、 プロパティを に設定して、関連するフィールドをジオタイプとしてインデックス化する Atlas Searchインデックスを作成します。indexShapestrueSearchIndexこのインデックスをクラスするにはMongoClient詳細については、 「未加工データベースクエリの実行」ガイドの 「MongoClient 操作」 を参照してください。

SearchGeoShape式は、形状を持つ空間関係に基づいてドキュメントをフィルタリングします。これはMongoDB geoShape 演算子に対応します。

この演算子を使用するには、次の引数を SearchGeoShape() コンストラクターに渡します。

  • path: The name of the field to search. You can specify a string value or a F instance.

  • relation: テストする空間関係。有効な値は "within""intersects""disjoint" です。

  • geometry: 比較する GeoJSON ジオメトリオブジェクト。

  • score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。

次の例では、SearchGeoShape式を使用して、指定された多角形内に geo 値を持つドキュメントを sample_mflix.theatersコレクションでクエリします。

chicago = {
"type": "Polygon",
"coordinates": [
[
[-87.851, 41.976],
[-87.851, 41.653],
[-87.651, 41.653],
[-87.651, 41.976],
[-87.851, 41.976],
]
]
}
theaters = Theater.objects.annotate(score=SearchGeoShape(
path="geo",
relation="within",
geometry=chicago
))

重要

追加のインデックス要件

Atlas Search クエリで SearchGeoWithin式を使用する前に、クエリフィールドをジオタイプとしてインデックスを作成する Atlas Searchインデックスを作成します。Dlango MongoDBバックエンドの SearchIndexクラスを使用してこのインデックスを作成することはできませんが、MongoClient で直接操作することでPyMongoドライバー メソッドを使用できます。詳細については、 「未加工データベースクエリの実行」ガイドの 「MongoClient 操作」 を参照してください。

SearchGeoWithin式は、指定された形状内に含まれる地理フィールドを持つドキュメントをフィルタリングします。これはMongoDB geoWithin 演算子に対応します。

この演算子を使用するには、次の引数を SearchGeoWithin() コンストラクターに渡します。

  • path: The name of the field to search. You can specify a string value or a F instance.

  • kind: GeoJSON ジオメトリタイプ: "circle""box"、または "geometry"

  • geometry: 空間境界を定義する GeoJSON ジオメトリ。

  • score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。

次の例では、SearchGeoWithin 演算子を使用して、指定された円内に geo 値を持つコレクションを sample_mflix.theaters コレクションでクエリします。

circle = {
"center": {"type": "Point", "coordinates": [-73.98, 40.75]},
"radius": 5000
}
theaters = Theater.objects.annotate(score=SearchGeoWithin(
path="geo",
kind="circle",
geometry=circle
))

SearchMoreLikeThis式は、指定された例に類似するドキュメントを検索します。これはMongoDB moreLikeThis 演算子に相当します。

この演算子を使用するには、次の引数を SearchMoreLikeThis() コンストラクターに渡します。

  • documents:類似性の参照となるドキュメントまたは式の例のリスト。

  • score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。

次の例では、SearchMoreLikeThis式を使用して、提供された例ドキュメントに類似するドキュメントを sample_mflix.moviesコレクションでクエリします。

Movie.objects.annotate(score=SearchMoreLikeThis([
{"title": "The Godfather"}, {"genres": ["Crime", "Drama"]}
]))

複数の検索式を組み合わせた Atlas Search クエリは、次の方法で実行できます。

CompoundExpression式を使用すると、ブール値ロジックを使用して複数の Atlas Search 式を組み合わせることができます。これはMongoDB複合演算子に対応します。

次の引数の 1 つ以上を CompoundExpression() コンストラクターに渡す必要があります。

  • must: ドキュメントが一致する必要がある式のリスト

  • should: ドキュメントが一致する必要がある 式 のリスト

  • must_not: ドキュメントが一致してはならない式のリスト

  • filter: 結果をフィルタリングする式のリスト

次の任意引数を渡すこともできます。

この例では、CompoundExpression式を使用して、sample_mflix.moviesコレクションで次の条件に一致するドキュメントをクエリします。

  • plot フィールドが存在する

  • plot フィールドにはテキストが含まれます "fast-paced"

  • genres フィールドには "Romance" または "Comedy" のいずれも含まれていません

plot_exists = SearchExists(path="plot")
plot_text = SearchText(path="plot", query="fast-paced")
genres_range = SearchIn(path="genres", value=["Romance", "Comedy"])
Movie.objects.annotate(
score=CompoundExpression(
must=[plot_exists, plot_text],
must_not=[genres_range]
)
)

次のビット演算子を使用して、Atlas Search 式を結合できます。

  • &: 論理 AND操作を表します

  • |: 論理和操作を表します

  • ~: 論理操作を表します

この例では、| 演算子を使用して、次のいずれかの条件に一致するドキュメントを sample_mflix.moviesコレクションでクエリします。

  • plot フィールドにはテキストが含まれます "heartwarming"

  • genres フィールドには "Romance" または "Comedy" のいずれかが含まれています

expr = SearchText(path="plot", query="heartwarming") | SearchIn(path="genres", value=["Romance", "Comedy"])
Movie.objects.annotate(score=expr)

MongoDB は、Atlas Search クエリで返されるすべてのドキュメントに関連性スコアを割り当てます。結果セットに含まれるドキュメントは、関連性スコアの高いものから低いものの順に並べられます。

SearchScoreOption式を使用して、 MongoDB が関連性スコアを計算して適用する方法をカスタマイズできます。SearchScoreOption() コンストラクターは次の引数を受け入れます。

  • boost: 指定された式に一致するドキュメントのスコアを増加させます

  • constant: すべての一致に固定スコアを適用します

  • function: スコアを計算するために関数を適用します

  • path:フィールドの値に基づいてドキュメントをスコアリングします

Tip

関連性スコアの詳細については、 MongoDB Atlasドキュメントの結果のドキュメントにスコアを付けるを参照してください。

次の例では、SearchEquals 式に一致するドキュメントの関連性式を 3 の係数でブーストします。

boost = SearchScoreOption({"boost": {"value": 3}})
Movie.objects.annotate(
score=SearchEquals(
path="title",
value="Life of Pi",
score=boost
)
)

Atlas Search インデックスの作成の詳細については、 インデックスの作成ガイドの「Atlas Search インデックス」を参照してください。

Atlas Search クエリの詳細については、 MongoDB AtlasドキュメントのAtlas Search の概要を参照してください。

戻る

Raw クエリの実行

項目一覧