Overview
このガイドでは、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 フィールド
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 インデックス」を参照してください。
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 クエリを実行する方法を示します。
SearchEquals
重要
追加のインデックス要件
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 aF
instance.value
: The value to match. You can specify a string value or aValue
instance.score
: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。
次の例では、SearchEquals
演算子を使用して、sample_mflix.movies
コレクションで title
の値が "Finding Nemo"
であるドキュメントをクエリします。
Movie.objects.annotate(score=SearchEquals(path="title", value="Finding Nemo"))
SearchAutocomplete
重要
追加のインデックス要件
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 aF
instance.query
: The input string to autocomplete. You can specify a string value or aValue
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
SearchExists
式は、指定されたフィールドが存在するドキュメントと一致します。これはMongoDB exists 演算子に対応します。
この演算子を使用するには、次の引数を SearchExists()
コンストラクターに渡します。
path
: The name of the field to match. You can specify a string value or aF
instance.score
: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。
次の例では、SearchExists
式を使用して、sample_mflix.movies
コレクションで plot
フィールドを持つドキュメントをクエリします。
Movie.objects.annotate(score=SearchExists(path="plot"))
SearchIn
重要
追加のインデックス要件
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 aF
instance.value
: The list of values to match. You can specify a list of values or aValue
instance.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
: The name of the field to search. You can specify a string value or aF
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
SearchQueryString
演算子を使用すると、string
フィールドに対してテキスト検索、ワイルドカード、正規式、ファジー検索、範囲検索を実行できます。これはMongoDB queryString 演算子に対応します。
この演算子を使用するには、次の引数を SearchQueryString()
コンストラクターに渡します。
path
: The name of the field to search. You can specify a string value or aF
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)"))
SearchRange
重要
追加のインデックス要件
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 aF
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
SearchRegex
式は、正規式を使用して文字列フィールド値と一致します。 これはMongoDB正規表現演算子に対応します。
この演算子を使用するには、次の引数を SearchRegex()
コンストラクターに渡します。
path
: The name of the field to search. You can specify a string value or aF
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 aF
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
SearchWildcard
式は、ワイルドカード パターンを使用して string と一致します。これは、 MongoDBワイルドカード演算子に対応します。
この演算子を使用するには、次の引数を SearchWildcard()
コンストラクターに渡します。
path
: The name of the field to search. You can specify a string value or aF
instance.query
: 任意の文字シーケンスに一致するように*
文字を含め、任意の 1 文字を一致させるために?
文字を含めることができるワイルドカード文字列。allow_analyzed_field
: (任意)分析されたフィールドとの一致を可能にするブール値値。デフォルト値はFalse
です。score
: (任意)関連性スコアを構成するSearchScoreOptionインスタンス。
次の例では、SearchWildcard
式を使用して、sample_mflix.movies
コレクションで、"Star"
で始まり、任意の文字で終わる title
を持つドキュメントをクエリします。
Movie.objects.annotate(score=SearchWildcard(path="title", query="Star*"))
SearchGeoShape
重要
追加のインデックス要件
SearchGeoShape
Atlas Search クエリで 式を使用する前に、 プロパティを に設定して、関連するフィールドをジオタイプとしてインデックス化する Atlas Searchインデックスを作成します。indexShapes
true
SearchIndex
このインデックスをクラスするにはMongoClient
詳細については、 「未加工データベースクエリの実行」ガイドの 「MongoClient 操作」 を参照してください。
SearchGeoShape
式は、形状を持つ空間関係に基づいてドキュメントをフィルタリングします。これはMongoDB geoShape 演算子に対応します。
この演算子を使用するには、次の引数を SearchGeoShape()
コンストラクターに渡します。
path
: The name of the field to search. You can specify a string value or aF
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 ))
SearchGeoWithin
重要
追加のインデックス要件
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 aF
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
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
: 結果をフィルタリングする式のリスト
次の任意引数を渡すこともできます。
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] ) )
ビット演算子の使用
次のビット演算子を使用して、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 の概要を参照してください。