Overview
このガイドでは、Diango MongoDBバックエンドを使用してコレクションに対して MongoDB Search クエリを実行する方法を説明します。 MongoDB Search を使用すると、 MongoDBコレクションに対して全文検索を実行できます。 MongoDB 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 モデルでは、地理空間データを保存するために、geo という名前の GeoDiango PointField を使用します。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アプリケーションを作成する方法については、使い始める チュートリアルをご覧ください。
MongoDB Search クエリの実行
重要
インデックスの要件
MongoDB Search クエリを実行中前に、関連するフィールドに Searchインデックスを作成する必要があります。検索インデックスの作成方法については、 インデックスの作成ガイドの「 検索インデックス 」を参照してください。
MongoDB Search クエリを実行するには、Diango の QuerySet APIの annotate() メソッドを使用します。検索演算子を含むMongoDB Search 条件を score 引数として annotate() に渡します。次のコードは、検索クエリを実行中ための基本的な構文を示しています。
Model.objects.annotate( score=<Search Operator>(path="<field name", <additional arguments>) )
検索演算子を指定するには、django_mongodb_backend.expressions モジュールが提供する式クラスを使用します。各クラスは、検索演算子に対応します。
次のセクションでは、サポートされている各式クラスを使用して検索クエリを実行する方法を示します。
SearchEquals
重要
追加のインデックス要件
SearchEquals検索クエリで5.2.2 式を使用する前に、関連するフィールドをトークン タイプとしてインデックスを作成する検索インデックスを作成してください。 Dlango MongoDBバックエンド v 以降では、 field_mapings 引数を使用してこのインデックスを作成できます。
SearchEquals式は、フィールドが指定された値と等しいドキュメントに一致します。これはMongoDB のequals 演算子に相当します。
この演算子を使用するには、次の引数を SearchEquals() コンストラクターに渡します。
path: 検索するフィールドの名前。string 値またはFインスタンスを指定できます。value: 一致する値。string 値またはValueインスタンスを指定できます。score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。
次の例では、SearchEquals 演算子を使用して、sample_mflix.moviesコレクションで title の値が "Finding Nemo" であるドキュメントをクエリします。
Movie.objects.annotate(score=SearchEquals(path="title", value="Finding Nemo"))
SearchAutocomplete
重要
追加のインデックス要件
SearchAutocomplete検索クエリで5.2.2 式を使用する前に、関連するフィールドをオートコンプリート タイプとしてインデックスを作成する検索インデックスを作成します。 Dlango MongoDBバックエンド v 以降では、 field_mapings 引数を使用してこのインデックスを作成できます。
SearchAutocomplete式は、不完全な入力 string からの文字シーケンスを含む または 単語のフレーズを検索します。これはMongoDB のオートコンプリート 演算子に相当します。
この演算子を使用するには、次の引数を SearchAutocomplete() コンストラクターに渡します。
path: 検索するフィールドの名前。string 値またはFインスタンスを指定できます。query: オートコンプリートする入力文字列。 string 値またはValueインスタンスを指定できます。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
SearchExists式は、指定されたフィールドが存在するドキュメントと一致します。これはMongoDB exists 演算子に対応します。
この演算子を使用するには、次の引数を SearchExists() コンストラクターに渡します。
path: 一致するフィールドの名前。string 値またはFインスタンスを指定できます。score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。
次の例では、SearchExists式を使用して、sample_mflix.moviesコレクションで plotフィールドを持つドキュメントをクエリします。
Movie.objects.annotate(score=SearchExists(path="plot"))
SearchIn
重要
追加のインデックス要件
検索クエリで SearchIn式を使用する前に、関連するフィールドに検索インデックスを作成します。 フィールドstring5.2.2 をクエリする場合は、 トークン タイプ としてインデックス必要があります。 Dlango MongoDBバックエンド v 以降では、 field_mappings 引数を使用してこのインデックスを作成できます。
SearchIn式は、フィールドの値が特定のリスト内にあるドキュメントと一致します。これはMongoDB in 演算子に対応します。
この演算子を使用するには、次の引数を SearchIn() コンストラクターに渡します。
path: 検索するフィールドの名前。string 値またはFインスタンスを指定できます。value: 一致する値のリスト。値のリストまたはValueインスタンスを指定できます。score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。
次の例では、SearchIn式を使用して、sample_mflix.moviesコレクションで、runtime 値が 100、200、または 300 分であるドキュメントをクエリします。
Movie.objects.annotate(score=SearchIn(path="runtime", value=[100, 200, 300]))
SearchP phrase
SearchPhrase式は、フィールド内の正確なタームのシーケンスまたはほぼ正確なシーケンスと一致します。これはMongoDB のフレーズ 演算子に相当します。
この演算子を使用するには、次の引数を SearchPhrase() コンストラクターに渡します。
path: 検索するフィールドの名前。string 値またはFインスタンスを指定できます。query: 一致するフレーズ。string または string のリストを指定できます。slop: (任意)フレーズ タームの間に許容されるタームの最大数。synonyms:(任意) 検索インデックスで定義されているシノニム マッピングの名前。score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。
次の例では、SearchPhrase式を使用して、sample_mflix.moviesコレクションで、plotフィールドにフレーズ "space adventure" を含むドキュメントをクエリします。これらのタームの間には最大 2 単語が含まれます。
Movie.objects.annotate(score=SearchPhrase(path="plot", query="space adventure", slop=2))
SearchQueryString
SearchQueryString 演算子を使用すると、string フィールドに対してテキスト検索、ワイルドカード、正規式、ファジー検索、範囲検索を実行できます。これはMongoDB queryString 演算子に対応します。
この演算子を使用するには、次の引数を SearchQueryString() コンストラクターに渡します。
path: 検索するフィールドの名前。string 値またはFインスタンスを指定できます。query: Lucene スタイルのクエリ文字列。 Lucene クエリ構文の詳細については、Apache Lucene ドキュメントを参照してください。score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。
次の例では、SearchQueryString式を使用して、sample_mflix.moviesコレクション内で plotフィールドで Lucene スタイルのクエリに一致するドキュメントをクエリします。
Movie.objects.annotate(score=SearchQueryString(path="plot", query="romance AND (paris OR tokyo)"))
SearchRange
重要
追加のインデックス要件
検索クエリで SearchRange式を使用する前に、関連するフィールドに検索インデックスを作成します。 フィールドstring5.2.2 をクエリする場合は、 トークン タイプ としてインデックス必要があります。 Dlango MongoDBバックエンド v 以降では、 field_mappings 引数を使用してこのインデックスを作成できます。
SearchRange式は、指定された範囲内の値を検索します。数値、日付、string、または ObjectId 値の範囲を指定できます。これは、 MongoDB範囲演算子に対応します。
この演算子を使用するには、次の引数を SearchRange() コンストラクターに渡します。
path: 検索するフィールドの名前。string 値またはFインスタンスを指定できます。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
SearchRegex式は、正規式を使用して文字列フィールド値と一致します。 これはMongoDB正規表現演算子に対応します。
この演算子を使用するには、次の引数を SearchRegex() コンストラクターに渡します。
path: 検索するフィールドの名前。string 値またはFインスタンスを指定できます。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: 検索するフィールドの名前。string 値またはFインスタンスを指定できます。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
SearchWildcard式は、ワイルドカード パターンを使用して string と一致します。これは、 MongoDBワイルドカード演算子に対応します。
この演算子を使用するには、次の引数を SearchWildcard() コンストラクターに渡します。
path: 検索するフィールドの名前。string 値またはFインスタンスを指定できます。query: 任意の文字シーケンスに一致するように*文字を含め、任意の 1 文字を一致させるために?文字を含めることができるワイルドカード文字列。allow_analyzed_field: (任意)分析されたフィールドとの一致を可能にするブール値値。デフォルト値はFalseです。score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。
次の例では、SearchWildcard式を使用して、sample_mflix.moviesコレクションで、"Star" で始まり、任意の文字で終わる title を持つドキュメントをクエリします。
Movie.objects.annotate(score=SearchWildcard(path="title", query="Star*"))
SearchGeoShape
重要
追加のインデックス要件
SearchGeoShapeindexShapestrue検索クエリで5.2.2 式を使用する前に、関連するフィールドを プロパティが に設定された ジオタイプ としてインデックス化する検索インデックスを作成します。 Dlango MongoDBバックエンド v 以降では、 field_mappings 引数を使用してこのインデックスを作成できます。
SearchGeoShape式は、形状を持つ空間関係に基づいてドキュメントをフィルタリングします。これはMongoDB geoShape 演算子に対応します。
この演算子を使用するには、次の引数を SearchGeoShape() コンストラクターに渡します。
path: 検索するフィールドの名前。string 値またはFインスタンスを指定できます。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 ))
SearchGeoWithin
重要
追加のインデックス要件
SearchGeoWithin検索クエリで5.2.2 式を使用する前に、クエリフィールドをジオタイプ としてインデックスを作成する検索インデックスを作成します。 Dlango MongoDBバックエンド v 以降では、 field_mapings 引数を使用してこのインデックスを作成できます。
SearchGeoWithin式は、指定された形状内に含まれる地理フィールドを持つドキュメントをフィルタリングします。これはMongoDB geoWithin 演算子に対応します。
この演算子を使用するには、次の引数を SearchGeoWithin() コンストラクターに渡します。
path: 検索するフィールドの名前。string 値またはFインスタンスを指定できます。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
SearchMoreLikeThis式は、指定された例に類似するドキュメントを検索します。これはMongoDB moreLikeThis 演算子に相当します。
この演算子を使用するには、次の引数を SearchMoreLikeThis() コンストラクターに渡します。
documents:類似性の参照となるドキュメントまたは式の例のリスト。score: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。
次の例では、SearchMoreLikeThis式を使用して、提供された例ドキュメントに類似するドキュメントを sample_mflix.moviesコレクションでクエリします。
Movie.objects.annotate(score=SearchMoreLikeThis([ {"title": "The Godfather"}, {"genres": ["Crime", "Drama"]} ]))
式を組み合わせます
複数の検索式を組み合わせたMongoDB Search クエリは、次の方法で実行できます。
複合式クラスの使用
CompoundExpression式を使用すると、ブール値ロジックを使用して複数の検索式を結合できます。これはMongoDB複合演算子に対応します。
次の引数の 1 つ以上を CompoundExpression() コンストラクターに渡す必要があります。
must: ドキュメントが一致する必要がある式のリストshould: ドキュメントが一致する必要がある 式 のリストmust_not: ドキュメントが一致してはならない式のリストfilter: 結果をフィルタリングする式のリスト
次の任意引数を渡すこともできます。
minimum_should_match: ドキュメントが一致する必要があるshould句の最小数score: 関連性スコアを構成する SearchScoreOptionインスタンス
この例では、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] ) )
ビット演算子の使用
次のビット演算子を使用して、検索式を結合できます。
&: 論理 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 は、検索クエリで返されるすべてのドキュメントに関連性スコアを割り当てます。結果セットに含まれるドキュメントは、関連性スコアの高いものから低いものの順に並べられます。
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 ) )
詳細情報
MongoDB Search インデックスの作成の詳細については、 インデックスの作成ガイドの「 検索インデックス 」を参照してください。
MongoDB Search クエリの詳細については、 MongoDB Atlasドキュメントの「 MongoDB Search の概要 」を参照してください。