カスタムアナライザを定義し、Atlas Search の発音区別符号を区別しないクエリを実行する方法
このチュートリアルでは、 カスタムアナライザを使用するインデックスを作成し、 sample_mflix.movies
コレクションに対して発音区別符号を区別しないクエリを実行する方法について説明します。 次の手順が必要です。
コレクションの フィールドと フィールドに Atlas Search インデックスを設定します。
title
genres
sample_mflix.movies
ワイルドカード 演算子と テキスト 演算子を使用して、 コレクション内の フィールドと
title
genres
フィールドに対して Atlas Search 複合sample_mflix.movies
クエリを実行します。
開始する前に、Atlas クラスターが前提条件 に記載されている要件を満たしていることを確認してください。
Atlas Search インデックスを作成するには、プロジェクトに対するProject Data Access Admin
以上のアクセス権が必要です。
Atlas Search インデックスの作成
title
genres
このセクションでは、sample_mflix.movies
コレクションの フィールドと フィールドに Atlas Search インデックスを作成します。
Atlas Atlasで、プロジェクトの {0 ページにGoします。GoClusters
まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー
まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。
まだ表示されていない場合は、サイドバーの [Clusters] をクリックします。
[ クラスター]ページが表示されます。
GoAtlas Searchクラスターの ページに します。
GoAtlas Searchページには、サイドバー、Data Explorer 、またはクラスターの詳細ページから できます。
サイドバーで、 Services見出しの下のAtlas Searchをクリックします。
[ Select data sourceドロップダウンからクラスターを選択し、[ Go to Atlas Search ] をクリックします。
Atlas Searchページが表示されます。
クラスターの [Browse Collections] ボタンをクリックします。
データベースを展開し、コレクションを選択します。
コレクションのSearch Indexesタブをクリックします。
Atlas Searchページが表示されます。
クラスタの名前をクリックします。
[Atlas Search] タブをクリックします。
Atlas Searchページが表示されます。
Index Name を入力し、Database and Collection を設定します。
Index Nameフィールドに
diacritic-insensitive-tutorial
と入力します。インデックスに
default
と名付けると、 $searchパイプライン ステージでindex
パラメータを指定する必要がなくなります。 インデックスにカスタム名を付ける場合は、index
パラメータでこの名前を指定する必要があります。Database and Collectionセクションで、
sample_mflix
データベースを検索し、movies
コレクションを選択します。
インデックスの定義を指定します。
フィールドとgenres
title
フィールドのこのインデックス定義は、次の を使用してカスタムアナライザdiacriticFolder
を指定します。
入力全体を単一のトークンとしてトークン化するキーワードトークナイザ。
アクセントの削除や大文字と小文字のフォールディングなど、文字のフォールディングを適用するicuフォールディングトークン フィルター。
インデックス定義では、 フィールドと フィールドの string 型を指定します。genres
title
また、 title
フィールドにdiacriticFolder
という名前のカスタムアナライザも適用されます。
インターフェースで またはAtlas SearchVisual Editor Atlas SearchJSON Editorを使用してインデックスを作成します。Atlas user
[Next] をクリックします。
[Refine Your Index] をクリックします。
Custom Analyzersセクションで、 Add Custom Analyzerをクリックします。
Create Your Ownラジオボタンを選択し、Next をクリックします。
Analyzer Nameフィールドに
diacriticFolder
と入力します。Tokenizerが折りたたまれている場合は展開し、ドロップダウンから
keyword
を選択します。Token Filtersを展開し、 をクリックしますAdd token filter 。
ドロップダウンから
icuFolding
を選択し、 Add token filterをクリックしてトークンフィルターをカスタムアナライザに追加します。Addをクリックして、カスタムアナライザをインデックスに追加します。
Field MappingsセクションでAdd Field Mappingをクリックして、 Customized Configurationタブの
title
フィールドにカスタムアナライザを適用します。title
Field Nameドロップダウンから [0}string Data Typeを選択し、 ドロップダウンから を選択します。データタイプのプロパティ
diacriticFolder
セクションで、Index Analyzer Search Analyzerドロップダウンと ドロップダウンから [ を選択します。[Add] をクリックします。
Add Field Mappingを再度クリックして、
genres
フィールドをインデックス化します。genres
Field Nameドロップダウンから [0}string Data Typeを選択し、 ドロップダウンから を選択します。[ Addをクリックし、 Save Changesをクリックします。
デフォルトの定義を以下のように置き換えます。
1 { 2 "mappings": { 3 "fields": { 4 "genres": { 5 "type": "string" 6 }, 7 "title": { 8 "analyzer": "diacriticFolder", 9 "type": "string" 10 } 11 } 12 }, 13 "analyzers": [{ 14 "charFilters": [], 15 "name": "diacriticFolder", 16 "tokenizer": { 17 "type": "keyword" 18 }, 19 "tokenFilters": [{ 20 "type": "icuFolding" 21 }] 22 }] 23 }
[Next] をクリックします。
コレクションを検索
➤ [言語の選択]ドロップダウン メニューを使用して、このセクション内の例の言語を設定します。
複合演算子を使用して、2 つ以上の演算子を 1 つのクエリに結合できます。 このセクションのサンプル クエリでは、title
genres
複合movies
演算子を使用して、複数の演算子を使用して コレクション内の フィールドと フィールドをクエリします。
このセクションでは、Atlas クラスターに接続し、 compound
演算子を使用してsample_mflix.movies
コレクションに対してサンプル クエリを実行します。
AtlasGoClustersAtlas で、プロジェクトの ページにGoします。
まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー
まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。
まだ表示されていない場合は、サイドバーの [Clusters] をクリックします。
[ Clusters (クラスター) ] ページが表示されます。
GoAtlas Searchクラスターの ページに します。
GoAtlas Searchページには、サイドバー、Data Explorer 、またはクラスターの詳細ページから できます。
サイドバーで、 Services見出しの下のAtlas Searchをクリックします。
[ Select data sourceドロップダウンからクラスターを選択し、[ Go to Atlas Search ] をクリックします。
Atlas Searchページが表示されます。
クラスターの [Browse Collections] ボタンをクリックします。
データベースを展開し、コレクションを選択します。
コレクションのSearch Indexesタブをクリックします。
Atlas Searchページが表示されます。
クラスタの名前をクリックします。
[Atlas Search] タブをクリックします。
Atlas Searchページが表示されます。
Atlas Search の発音区別符号を区別しないクエリを実行します。
このクエリは、 $search
ステージでcompound
演算子を使用してコレクションをクエリします。 compound
演算子は次の句を使用します。
次のクエリをコピーして、 Query Editorに貼り付け、 Query EditorのSearchボタンをクリックします。
1 [ 2 { 3 "$search" : { 4 "index": "diacritic-insensitive-tutorial", 5 "compound" : { 6 "must": [{ 7 "wildcard" : { 8 "query" : "alle*", 9 "path": "title", 10 "allowAnalyzedField": true 11 } 12 }], 13 "should": [{ 14 "text": { 15 "query" : "Drama", 16 "path" : "genres" 17 } 18 }] 19 } 20 } 21 } 22 ]
SCORE: 1.2084882259368896 _id: "573a13a1f29313caabd07bb6" plot: "A group of hip retro teenage outsiders become involved in an interscho…" genres: 0: "Drama" 1: "Family" 2: "Sport" runtime: 103 title: "Alley Cats Strike" SCORE: 1.179288625717163 _id: "573a13b1f29313caabd382a2" plot: "Famous pianist Zetterstrèm returns home to his native Denmark, to give…" genres: 0: "Drama" 1: "Romance" 2: "Sci-Fi" runtime: 88 title: "Allegro" SCORE: 1 _id: "573a1397f29313caabce5f15" plot: "An enthusiastic filmmaker thinks he's come up with a totally original …" genres: 0: "Animation" 1: "Comedy" 2: "Fantasy" runtime: 75 title: "Allegro non troppo" SCORE: 1 _id: "573a13d1f29313caabd8f84b" plot: "The eleven year old cycling talent Freddy is the son of a butcher in a…" genres: 0: "Comedy" runtime: 100 title: "Allez, Eddy!"
クエリ結果を展開します。
Search Testerでは、返されるドキュメント内のすべてのフィールドが表示されない場合があります。 クエリパスで指定したフィールドを含むすべてのフィールドを表示するには、結果内のドキュメントを展開します。
allè
のワイルドカード検索では、発音区別符号が含まれていなくても、title
フィールドが alle
で始まるドキュメントを返します。これは、title
フィールドに使用した diacriticsFolder
カスタムアナライザが、その値に文字の折りたたみを適用したためです。Atlas Search は、クエリターム allè
で始まるタイトルのドキュメントを返します。これは、キーワードトークナイザを使用すると、文字列(またはフレーズ)全体が単一のトークンとしてトークン化されるためです。
または、タイトルフィールドで使用されるカスタムアナライザにおいて、キーワードトークナイザの代わりに標準トークナイザを指定することもできます。標準のトークナイザを使用すると、Atlas Search の結果には、クエリターム allè
で始まるタイトル、または「Desde allè」のようにクエリタームが単語の先頭に現れるタイトルを持つドキュメントが含まれます。これをテストするには、インデックス定義を編集し、17 行目の keyword
トークナイザを standard
トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。
mongosh
内のクラスターに接続します。
ターミナル ウィンドウでmongosh
を開き、クラスターに接続します。 接続の詳細な手順については、「 mongosh
経由での接続 」を参照してください。
sample_mflix
データベースを使用します。
mongosh
プロンプトで次のコマンドを実行します。
use sample_mflix
Atlas Search の発音区別符号を区別しないクエリを実行します。
このクエリは、 $search
ステージでcompound
演算子を使用してコレクションをクエリします。 compound
演算子は次の句を使用します。
クエリは、 $project
ステージを使用して次の操作を実行します。
title
とgenres
を除くすべてのフィールドを除外次のフィールドを追加:
score
1 db.movies.aggregate([ 2 { 3 "$search" : { 4 "index": "diacritic-insensitive-tutorial", 5 "compound" : { 6 "must": [{ 7 "wildcard" : { 8 "query" : "allè*", 9 "path": "title", 10 "allowAnalyzedField": true 11 } 12 }], 13 "should": [{ 14 "text": { 15 "query" : "Drama", 16 "path" : "genres" 17 } 18 }] 19 } 20 } 21 }, 22 { 23 "$project" : { 24 "_id" : 0, 25 "title" : 1, 26 "genres" : 1, 27 "score" : { "$meta": "searchScore" } 28 } 29 } 30 ])
{ genres: [ 'Drama', 'Family', 'Sport' ], title: 'Alley Cats Strike', score: 1.2084882259368896 }, { genres: [ 'Drama', 'Romance', 'Sci-Fi' ], title: 'Allegro', score: 1.179288625717163 }, { genres: [ 'Animation', 'Comedy', 'Fantasy' ], title: 'Allegro non troppo', score: 1 }, { genres: [ 'Comedy' ], title: 'Allez, Eddy!', score: 1 }
allè
のワイルドカード検索では、発音区別符号が含まれていなくても、title
フィールドが alle
で始まるドキュメントを返します。これは、title
フィールドに使用した diacriticsFolder
カスタムアナライザが、その値に文字の折りたたみを適用したためです。Atlas Search は、クエリターム allè
で始まるタイトルのドキュメントを返します。これは、キーワードトークナイザを使用すると、文字列(またはフレーズ)全体が単一のトークンとしてトークン化されるためです。
または、タイトルフィールドで使用されるカスタムアナライザにおいて、キーワードトークナイザの代わりに標準トークナイザを指定することもできます。標準のトークナイザを使用すると、Atlas Search の結果には、クエリターム allè
で始まるタイトル、または「Desde allè」のようにクエリタームが単語の先頭に現れるタイトルを持つドキュメントが含まれます。これをテストするには、インデックス定義を編集し、17 行目の keyword
トークナイザを standard
トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。
MongoDB Compass のクラスターに接続します。
MongoDB Compass を開き、クラスターに接続します。 接続の詳細な手順については、「 Compass 経由での接続 」を参照してください。
Atlas Search の発音区別符号を区別しないクエリを実行します。
このクエリでは、次のcompound
演算子句を使用してコレクションをクエリします。
クエリは、 $project
ステージを使用して次の操作を実行します。
title
とgenres
を除くすべてのフィールドを除外次のフィールドを追加:
score
MongoDB Compass でこのクエリを実行するには:
[Aggregations] タブをクリックします。
Select...をクリックし、ドロップダウンからステージを選択し、そのステージのクエリを追加して、次の各パイプライン ステージを構成します。 ステージを追加するには、 Add Stageをクリックします。
パイプラインステージ | クエリ | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| ||||||||||||||||||
|
|
Auto Previewを有効にした場合、MongoDB Compass は$project
パイプライン ステージの横に次のドキュメントを表示します。
{ genres: [ 'Drama', 'Family', 'Sport' ], title: 'Alley Cats Strike', score: 1.2084882259368896 }, { genres: [ 'Drama', 'Romance', 'Sci-Fi' ], title: 'Allegro', score: 1.179288625717163 }, { genres: [ 'Animation', 'Comedy', 'Fantasy' ], title: 'Allegro non troppo', score: 1 }, { genres: [ 'Comedy' ], title: 'Allez, Eddy!', score: 1 }
allè
のワイルドカード検索では、発音区別符号が含まれていなくても、title
フィールドが alle
で始まるドキュメントを返します。これは、title
フィールドに使用した diacriticsFolder
カスタムアナライザが、その値に文字の折りたたみを適用したためです。Atlas Search は、クエリターム allè
で始まるタイトルのドキュメントを返します。これは、キーワードトークナイザを使用すると、文字列(またはフレーズ)全体が単一のトークンとしてトークン化されるためです。
または、タイトルフィールドで使用されるカスタムアナライザにおいて、キーワードトークナイザの代わりに標準トークナイザを指定することもできます。標準のトークナイザを使用すると、Atlas Search の結果には、クエリターム allè
で始まるタイトル、または「Desde allè」のようにクエリタームが単語の先頭に現れるタイトルを持つドキュメントが含まれます。これをテストするには、インデックス定義を編集し、17 行目の keyword
トークナイザを standard
トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。
Program.cs
ファイルにクエリを作成します。
Program.cs
ファイルの内容を、次のコードで置き換えます。このコード例では、次のタスクを実行します。
mongodb
パッケージと依存関係をインポートします。Atlas クラスターへの接続を確立します。
次の
compound
演算子句を使用して、コレクションをクエリします。クエリは、
$project
ステージを使用して次の操作を実行します。title
とgenres
を除くすべてのフィールドを除外次のフィールドを追加:
score
カーソルを反復処理して、クエリに一致するドキュメントを出力します。
1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 using MongoDB.Driver.Search; 6 7 public class DiacriticInsensitiveExample 8 { 9 private const string MongoConnectionString = "<connection-string>"; 10 11 public static void Main(string[] args) 12 { 13 // allow automapping of the camelCase database fields to our MovieDocument 14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; 15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 16 17 // connect to your Atlas cluster 18 var mongoClient = new MongoClient(MongoConnectionString); 19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix"); 20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies"); 21 22 // define and run pipeline 23 var results = moviesCollection.Aggregate() 24 .Search(Builders<MovieDocument>.Search.Compound() 25 .Must(Builders<MovieDocument>.Search.Wildcard(movie => movie.Title, "allè*", true)) 26 .Should(Builders<MovieDocument>.Search.Text(movie => movie.Genres, "Drama")), 27 indexName: "diacritic-insensitive-tutorial") 28 .Project<MovieDocument>(Builders<MovieDocument>.Projection 29 .Include(movie => movie.Title) 30 .Include(movie => movie.Genres) 31 .Exclude(movie => movie.Id) 32 .MetaSearchScore(movie => movie.Score)) 33 .ToList(); 34 35 // print results 36 foreach (var movie in results) 37 { 38 Console.WriteLine(movie.ToJson()); 39 } 40 } 41 } 42 43 [ ]44 public class MovieDocument 45 { 46 [ ]47 public ObjectId Id { get; set; } 48 public string [] Genres { get; set; } 49 public string Title { get; set; } 50 public double Score { get; set; } 51 } サンプルを実行する前に、
<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。
Program.cs
ファイルをコンパイルして実行します。
dotnet run diacritic-insensitive-example.csproj
{ "genres" : ["Drama", "Family", "Sport"], "title" : "Alley Cats Strike", "score" : 1.2084882259368896 } { "genres" : ["Drama", "Romance", "Sci-Fi"], "title" : "Allegro", "score" : 1.1792886257171631 } { "genres" : ["Animation", "Comedy", "Fantasy"], "title" : "Allegro non troppo", "score" : 1.0 } { "genres" : ["Comedy"], "title" : "Allez, Eddy!", "score" : 1.0 }
allè
のワイルドカード検索では、発音区別符号が含まれていなくても、title
フィールドが alle
で始まるドキュメントを返します。これは、title
フィールドに使用した diacriticsFolder
カスタムアナライザが、その値に文字の折りたたみを適用したためです。Atlas Search は、クエリターム allè
で始まるタイトルのドキュメントを返します。これは、キーワードトークナイザを使用すると、文字列(またはフレーズ)全体が単一のトークンとしてトークン化されるためです。
または、タイトルフィールドで使用されるカスタムアナライザにおいて、キーワードトークナイザの代わりに標準トークナイザを指定することもできます。標準のトークナイザを使用すると、Atlas Search の結果には、クエリターム allè
で始まるタイトル、または「Desde allè」のようにクエリタームが単語の先頭に現れるタイトルを持つドキュメントが含まれます。これをテストするには、インデックス定義を編集し、17 行目の keyword
トークナイザを standard
トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。
Atlas Search の発音区別符号を区別しないクエリを実行します。
diacritic-insensitive.go
という名前のファイルを作成します。次のコードをコピーして、
diacritic-insensitive.go
ファイルに貼り付けます。このコード例では、次のタスクを実行します。
mongodb
パッケージと依存関係をインポートします。Atlas クラスターへの接続を確立します。
次の
compound
演算子句を使用して、コレクションをクエリします。クエリは、
$project
ステージを使用して次の操作を実行します。title
とgenres
を除くすべてのフィールドを除外次のフィールドを追加:
score
カーソルを反復処理して、クエリに一致するドキュメントを出力します。
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/bson" 8 "go.mongodb.org/mongo-driver/mongo" 9 "go.mongodb.org/mongo-driver/mongo/options" 10 ) 11 12 func main() { 13 // connect to your Atlas cluster 14 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>")) 15 if err != nil { 16 panic(err) 17 } 18 defer client.Disconnect(context.TODO()) 19 20 // set namespace 21 collection := client.Database("sample_mflix").Collection("movies") 22 23 // define pipeline stages 24 searchStage := bson.D{{"$search", bson.M{ 25 "index": "diacritic-insensitive-tutorial", 26 "compound": bson.M{ 27 "must": bson.M{ 28 "wildcard": bson.M{ 29 "path": "title", 30 "query": "allè*", 31 "allowAnalyzedField": true, 32 }, 33 }, 34 "should": bson.D{ 35 {"text", bson.M{ 36 "path": "genres", 37 "query": "Drama"}}}, 38 }, 39 }}} 40 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"genres", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "searchScore"}}}}}} 41 42 // run pipeline 43 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, projectStage}) 44 if err != nil { 45 panic(err) 46 } 47 48 // print results 49 var results []bson.D 50 if err = cursor.All(context.TODO(), &results); err != nil { 51 panic(err) 52 } 53 for _, result := range results { 54 fmt.Println(result) 55 } 56 } サンプルを実行する前に、
<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。次のコマンドを実行して、コレクションをクエリします。
go run diacritic-insensitive.go [{genres [Drama Family Sport]} {title Alley Cats Strike} {score 1.2084882259368896}] [{genres [Drama Romance Sci-Fi]} {title Allegro} {score 1.179288625717163}] [{genres [Animation Comedy Fantasy]} {title Allegro non troppo} {score 1}] [{genres [Comedy]} {title Allez, Eddy!} {score 1}]
allè
のワイルドカード検索では、発音区別符号が含まれていなくても、title
フィールドが alle
で始まるドキュメントを返します。これは、title
フィールドに使用した diacriticsFolder
カスタムアナライザが、その値に文字の折りたたみを適用したためです。Atlas Search は、クエリターム allè
で始まるタイトルのドキュメントを返します。これは、キーワードトークナイザを使用すると、文字列(またはフレーズ)全体が単一のトークンとしてトークン化されるためです。
または、タイトルフィールドで使用されるカスタムアナライザにおいて、キーワードトークナイザの代わりに標準トークナイザを指定することもできます。標準のトークナイザを使用すると、Atlas Search の結果には、クエリターム allè
で始まるタイトル、または「Desde allè」のようにクエリタームが単語の先頭に現れるタイトルを持つドキュメントが含まれます。これをテストするには、インデックス定義を編集し、17 行目の keyword
トークナイザを standard
トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。
Atlas Search の発音区別符号を区別しないクエリを実行します。
DiacriticInsensitive.java
という名前のファイルを作成します。次のコードをコピーして、
DiacriticInsensitive.java
ファイルに貼り付けます。このコード例では、次のタスクを実行します。
mongodb
パッケージと依存関係をインポートします。Atlas クラスターへの接続を確立します。
次の
compound
演算子句を使用して、コレクションをクエリします。クエリは、
$project
ステージを使用して次の操作を実行します。title
とgenres
を除くすべてのフィールドを除外次のフィールドを追加:
score
カーソルを反復処理して、クエリに一致するドキュメントを出力します。
1 import static com.mongodb.client.model.Aggregates.project; 2 import static com.mongodb.client.model.Projections.*; 3 import com.mongodb.client.MongoClient; 4 import com.mongodb.client.MongoClients; 5 import com.mongodb.client.MongoCollection; 6 import com.mongodb.client.MongoDatabase; 7 import org.bson.Document; 8 import java.util.Arrays; 9 import java.util.List; 10 11 public class tutorial { 12 public static void main(String[] args) { 13 // define clauses 14 List<Document> mustClauses = 15 List.of( new Document("wildcard", 16 new Document("path", "title") 17 .append("query", "allè*") 18 .append("allowAnalyzedField", true))); 19 List<Document> shouldClauses = 20 List.of( new Document("text", 21 new Document("query", "Drama") 22 .append("path", "genres"))); 23 // define pipeline 24 Document agg = new Document( "$search", 25 new Document("index", "diacritic-insensitive-tutorial") 26 .append("compound", 27 new Document("must", mustClauses) 28 .append("should", shouldClauses))); 29 30 // connect to your Atlas cluster 31 String uri = "<connection-string>"; 32 33 try (MongoClient mongoClient = MongoClients.create(uri)) { 34 // set namespace 35 MongoDatabase database = mongoClient.getDatabase("sample_mflix"); 36 MongoCollection<Document> collection = database.getCollection("movies"); 37 38 // run pipeline and print results 39 collection.aggregate(Arrays.asList(agg, 40 project(fields( 41 excludeId(), 42 include("title"), 43 include("genres"), 44 computed("score", new Document("$meta", "searchScore")))))) 45 .forEach(doc -> System.out.println(doc.toJson())); 46 } 47 } 48 } 注意
Maven 環境でサンプル コードを実行するには、 ファイルのインポート ステートメントの上に次のコードを追加します。
package com.mongodb.drivers; サンプルを実行する前に、
<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。DiacriticInsensitive.java
ファイルをコンパイルして実行します。javac DiacriticInsensitive.java java DiacriticInsensitive {"genres": ["Drama", "Family", "Sport"], "title": "Alley Cats Strike", "score": 1.2084882259368896} {"genres": ["Drama", "Romance", "Sci-Fi"], "title": "Allegro", "score": 1.179288625717163} {"genres": ["Animation", "Comedy", "Fantasy"], "title": "Allegro non troppo", "score": 1.0} {"genres": ["Comedy"], "title": "Allez, Eddy!", "score": 1.0}
allè
のワイルドカード検索では、発音区別符号が含まれていなくても、title
フィールドが alle
で始まるドキュメントを返します。これは、title
フィールドに使用した diacriticsFolder
カスタムアナライザが、その値に文字の折りたたみを適用したためです。Atlas Search は、クエリターム allè
で始まるタイトルのドキュメントを返します。これは、キーワードトークナイザを使用すると、文字列(またはフレーズ)全体が単一のトークンとしてトークン化されるためです。
または、タイトルフィールドで使用されるカスタムアナライザにおいて、キーワードトークナイザの代わりに標準トークナイザを指定することもできます。標準のトークナイザを使用すると、Atlas Search の結果には、クエリターム allè
で始まるタイトル、または「Desde allè」のようにクエリタームが単語の先頭に現れるタイトルを持つドキュメントが含まれます。これをテストするには、インデックス定義を編集し、17 行目の keyword
トークナイザを standard
トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。
Atlas Search の発音区別符号を区別しないクエリを実行します。
DiacriticInsensitive.kt
という名前のファイルを作成します。次のコードをコピーして、
DiacriticInsensitive.kt
ファイルに貼り付けます。このコード例では、次のタスクを実行します。
mongodb
パッケージと依存関係をインポートします。Atlas クラスターへの接続を確立します。
次の
compound
演算子句を使用して、コレクションをクエリします。クエリは、
$project
ステージを使用して次の操作を実行します。title
とgenres
を除くすべてのフィールドを除外次のフィールドを追加:
score
クエリに一致するドキュメントを
AggregateFlow
インスタンスから出力します。
1 import com.mongodb.client.model.Aggregates.project 2 import com.mongodb.client.model.Projections.* 3 import com.mongodb.kotlin.client.coroutine.MongoClient 4 import kotlinx.coroutines.runBlocking 5 import org.bson.Document 6 7 fun main() { 8 // connect to your Atlas cluster 9 val uri = "<connection-string>" 10 val mongoClient = MongoClient.create(uri) 11 12 // set namespace 13 val database = mongoClient.getDatabase("sample_mflix") 14 val collection = database.getCollection<Document>("movies") 15 16 runBlocking { 17 // define clauses 18 val mustClauses = listOf( 19 Document( 20 "wildcard", 21 Document("path", "title") 22 .append("query", "allè*") 23 .append("allowAnalyzedField", true) 24 ) 25 ) 26 27 val shouldClauses = listOf( 28 Document( 29 "text", 30 Document("query", "Drama") 31 .append("path", "genres") 32 ) 33 ) 34 35 // define pipeline 36 val agg = Document( "\$search", 37 Document("index", "diacritic-insensitive-tutorial") 38 .append("compound", Document("must", mustClauses) 39 .append("should", shouldClauses) 40 ) 41 ) 42 43 // run pipeline and print results 44 val resultsFlow = collection.aggregate<Document>( 45 listOf( 46 agg, 47 project(fields( 48 excludeId(), 49 include("title", "genres"), 50 computed("score", Document("\$meta", "searchScore")))) 51 ) 52 ) 53 resultsFlow.collect { println(it) } 54 } 55 56 mongoClient.close() 57 } サンプルを実行する前に、
<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。DiacriticInsensitive.kt
ファイルを実行します。IDE で
DiacriticInsensitive.kt
プログラムを実行すると、次のドキュメントが出力されます。Document{{genres=[Drama, Family, Sport], title=Alley Cats Strike, score=1.2084882259368896}} Document{{genres=[Drama, Romance, Sci-Fi], title=Allegro, score=1.179288625717163}} Document{{genres=[Animation, Comedy, Fantasy], title=Allegro non troppo, score=1.0}} Document{{genres=[Comedy], title=Allez, Eddy!, score=1.0}}
allè
のワイルドカード検索では、発音区別符号が含まれていなくても、title
フィールドが alle
で始まるドキュメントを返します。これは、title
フィールドに使用した diacriticsFolder
カスタムアナライザが、その値に文字の折りたたみを適用したためです。Atlas Search は、クエリターム allè
で始まるタイトルのドキュメントを返します。これは、キーワードトークナイザを使用すると、文字列(またはフレーズ)全体が単一のトークンとしてトークン化されるためです。
または、タイトルフィールドで使用されるカスタムアナライザにおいて、キーワードトークナイザの代わりに標準トークナイザを指定することもできます。標準のトークナイザを使用すると、Atlas Search の結果には、クエリターム allè
で始まるタイトル、または「Desde allè」のようにクエリタームが単語の先頭に現れるタイトルを持つドキュメントが含まれます。これをテストするには、インデックス定義を編集し、17 行目の keyword
トークナイザを standard
トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。
Atlas Search の発音区別符号を区別しないクエリを実行します。
diacritic-insensitive.js
という名前のファイルを作成します。次のコードをコピーして、
diacritic-insensitive.js
ファイルに貼り付けます。このコード例では、次のタスクを実行します。
MongoDB の Node.js ドライバーである
mongodb
をインポートします。Atlas クラスターへの接続を確立するための
MongoClient
クラスのインスタンスを作成します。次の
compound
演算子句を使用して、コレクションをクエリします。クエリは、
$project
ステージを使用して次の操作を実行します。title
とgenres
を除くすべてのフィールドを除外次のフィールドを追加:
score
カーソルを反復処理して、クエリに一致するドキュメントを出力します。
1 const { MongoClient } = require("mongodb"); 2 3 // Replace the uri string with your MongoDB deployment's connection string. 4 const uri = 5 "<connection-string>"; 6 7 const client = new MongoClient(uri); 8 9 async function run() { 10 try { 11 await client.connect(); 12 13 // set namespace 14 const database = client.db("sample_mflix"); 15 const coll = database.collection("movies"); 16 17 // define pipeline 18 const agg = [{ 19 '$search': { 20 'index': 'diacritic-insensitive-tutorial', 21 'compound': { 22 'must': [{ 23 'wildcard': { 24 'query': "allè*", 25 'path': "title", 26 'allowAnalyzedField': true 27 } 28 }], 29 'should': [{'text': {'query': 'Drama', 'path': 'genres'}}] 30 }}}, 31 { '$project': { '_id': 0, 'title': 1 , 'genres': 1, 'score': {'$meta': 'searchScore'}}}]; 32 33 // run pipeline 34 const result = await coll.aggregate(agg); 35 36 // print results 37 await result.forEach((doc) => console.log(doc)); 38 39 } finally { 40 await client.close(); 41 } 42 } 43 run().catch(console.dir); サンプルを実行する前に、
<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。次のコマンドを実行して、コレクションをクエリします。
node diacritic-insensitive.js { genres: [ 'Drama', 'Family', 'Sport' ], title: 'Alley Cats Strike', score: 1.2084882259368896 } { genres: [ 'Drama', 'Romance', 'Sci-Fi' ], title: 'Allegro', score: 1.179288625717163 } { genres: [ 'Animation', 'Comedy', 'Fantasy' ], title: 'Allegro non troppo', score: 1 } { genres: [ 'Comedy' ], title: 'Allez, Eddy!', score: 1 }
allè
のワイルドカード検索では、発音区別符号が含まれていなくても、title
フィールドが alle
で始まるドキュメントを返します。これは、title
フィールドに使用した diacriticsFolder
カスタムアナライザが、その値に文字の折りたたみを適用したためです。Atlas Search は、クエリターム allè
で始まるタイトルのドキュメントを返します。これは、キーワードトークナイザを使用すると、文字列(またはフレーズ)全体が単一のトークンとしてトークン化されるためです。
または、タイトルフィールドで使用されるカスタムアナライザにおいて、キーワードトークナイザの代わりに標準トークナイザを指定することもできます。標準のトークナイザを使用すると、Atlas Search の結果には、クエリターム allè
で始まるタイトル、または「Desde allè」のようにクエリタームが単語の先頭に現れるタイトルを持つドキュメントが含まれます。これをテストするには、インデックス定義を編集し、17 行目の keyword
トークナイザを standard
トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。
Atlas Search の発音区別符号を区別しないクエリを実行します。
diacritic-insensitive.py
という名前のファイルを作成します。次のコードをコピーして、
diacritic-insensitive.py
ファイルに貼り付けます。次のコード例では、次を行います。
pymongo
、MongoDB の Python ドライバー、およびDNSシード リスト接続文字列を使用してpymongo
をAtlas
に接続するために必要なdns
モジュールをインポートします。Atlas クラスターへの接続を確立するための
MongoClient
クラスのインスタンスを作成します。次の
compound
演算子句を使用して、コレクションをクエリします。クエリは、
$project
ステージを使用して次の操作を実行します。title
とgenres
を除くすべてのフィールドを除外次のフィールドを追加:
score
カーソルを反復処理して、クエリに一致するドキュメントを出力します。
1 import pymongo 2 3 # connect to your Atlas cluster 4 client = pymongo.MongoClient('<connection-string>') 5 6 # define pipeline 7 pipeline = [ 8 {'$search': { 9 'index': 'diacritic-insensitive-tutorial', 10 'compound': { 11 'must': [{'wildcard': {'path': 'title', 'query': 'allè*', 'allowAnalyzedField': True}}], 12 'should': [{'text': {'query': 'Drama', 'path': 'genres'}}]}}}, 13 {'$project': {'_id': 0, 'title': 1, 'genres': 1, 'score': {'$meta': 'searchScore'}}} 14 ] 15 16 # run pipeline 17 result = client['sample_mflix']['movies'].aggregate(pipeline) 18 19 # print results 20 for i in result: 21 print(i) サンプルを実行する前に、
<connection-string>
をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。次のコマンドを実行して、コレクションをクエリします。
python diacritic-insensitive.py {'genres': ['Drama', 'Family', 'Sport'], 'title': 'Alley Cats Strike', 'score': 1.2084882259368896} {'genres': ['Drama', 'Romance', 'Sci-Fi'], 'title': 'Allegro', 'score': 1.179288625717163} {'genres': ['Animation', 'Comedy', 'Fantasy'], 'title': 'Allegro non troppo', 'score': 1.0} {'genres': ['Comedy'], 'title': 'Allez, Eddy!', 'score': 1.0}
allè
のワイルドカード検索では、発音区別符号が含まれていなくても、title
フィールドが alle
で始まるドキュメントを返します。これは、title
フィールドに使用した diacriticsFolder
カスタムアナライザが、その値に文字の折りたたみを適用したためです。Atlas Search は、クエリターム allè
で始まるタイトルのドキュメントを返します。これは、キーワードトークナイザを使用すると、文字列(またはフレーズ)全体が単一のトークンとしてトークン化されるためです。
または、タイトルフィールドで使用されるカスタムアナライザにおいて、キーワードトークナイザの代わりに標準トークナイザを指定することもできます。標準のトークナイザを使用すると、Atlas Search の結果には、クエリターム allè
で始まるタイトル、または「Desde allè」のようにクエリタームが単語の先頭に現れるタイトルを持つドキュメントが含まれます。これをテストするには、インデックス定義を編集し、17 行目の keyword
トークナイザを standard
トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。