Docs Menu
Docs Home
/
MongoDB Atlas
/ /

カスタムアナライザを定義し、Atlas Search の発音区別符号を区別しないクエリを実行する方法

項目一覧

  • Atlas Search インデックスの作成
  • コレクションを検索

このチュートリアルでは、 カスタムアナライザを使用するインデックスを作成し、 sample_mflix.moviesコレクションに対して発音区別符号を区別しないクエリを実行する方法について説明します。 次の手順が必要です。

  1. コレクションの フィールドと フィールドに Atlas Search インデックスを設定します。titlegenressample_mflix.movies

  2. ワイルドカード 演算子と テキスト 演算子を使用して、 コレクション内の フィールドとtitle genresフィールドに対して Atlas Search 複合sample_mflix.movies クエリを実行します。

開始する前に、Atlas クラスターが前提条件 に記載されている要件を満たしていることを確認してください。

Atlas Search インデックスを作成するには、プロジェクトに対するProject Data Access Admin以上のアクセス権が必要です。

titlegenresこのセクションでは、sample_mflix.movies コレクションの フィールドと フィールドに Atlas Search インデックスを作成します。

1
  1. まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー

  2. まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。

  3. まだ表示されていない場合は、サイドバーの [Clusters] をクリックします。

    [ クラスター]ページが表示されます。

2

GoAtlas Searchページには、サイドバー、Data Explorer 、またはクラスターの詳細ページから できます。

  1. サイドバーで、 Services見出しの下のAtlas Searchをクリックします。

  2. [ Select data sourceドロップダウンからクラスターを選択し、[ Go to Atlas Search ] をクリックします。

    Atlas Searchページが表示されます。

  1. クラスターの [Browse Collections] ボタンをクリックします。

  2. データベースを展開し、コレクションを選択します。

  3. コレクションのSearch Indexesタブをクリックします。

    Atlas Searchページが表示されます。

  1. クラスタの名前をクリックします。

  2. [Atlas Search] タブをクリックします。

    Atlas Searchページが表示されます。

3
4
5
  1. Index Nameフィールドにdiacritic-insensitive-tutorialと入力します。

    インデックスにdefaultと名付けると、 $searchパイプライン ステージでindexパラメータを指定する必要がなくなります。 インデックスにカスタム名を付ける場合は、 indexパラメータでこの名前を指定する必要があります。

  2. Database and Collectionセクションで、 sample_mflixデータベースを検索し、 moviesコレクションを選択します。

6

フィールドとgenres titleフィールドのこのインデックス定義は、次の を使用してカスタムアナライザdiacriticFolder を指定します。

  • 入力全体を単一のトークンとしてトークン化するキーワードトークナイザ。

  • アクセントの削除や大文字と小文字のフォールディングなど、文字のフォールディングを適用するicuフォールディングトークン フィルター。

インデックス定義では、 フィールドと フィールドの string 型を指定します。genrestitleまた、 titleフィールドにdiacriticFolderという名前のカスタムアナライザも適用されます。

インターフェースで またはAtlas SearchVisual Editor Atlas SearchJSON Editorを使用してインデックスを作成します。Atlas user

  1. [Next] をクリックします。

  2. [Refine Your Index] をクリックします。

  3. Custom Analyzersセクションで、 Add Custom Analyzerをクリックします。

  4. Create Your Ownラジオボタンを選択し、Next をクリックします。

  5. Analyzer NameフィールドにdiacriticFolderと入力します。

  6. Tokenizerが折りたたまれている場合は展開し、ドロップダウンからkeywordを選択します。

  7. Token Filtersを展開し、 をクリックしますAdd token filter

  8. ドロップダウンからicuFoldingを選択し、 Add token filterをクリックしてトークンフィルターをカスタムアナライザに追加します。

  9. Addをクリックして、カスタムアナライザをインデックスに追加します。

  10. Field MappingsセクションでAdd Field Mappingをクリックして、 Customized Configurationタブのtitleフィールドにカスタムアナライザを適用します。

  11. titleField Nameドロップダウンから [0}string Data Typeを選択し、 ドロップダウンから を選択します。

  12. データタイプのプロパティdiacriticFolder セクションで、Index Analyzer Search Analyzerドロップダウンと ドロップダウンから [ を選択します。

  13. [Add] をクリックします。

  14. Add Field Mappingを再度クリックして、 genresフィールドをインデックス化します。

  15. genresField Nameドロップダウンから [0}string Data Typeを選択し、 ドロップダウンから を選択します。

  16. [ Addをクリックし、 Save Changesをクリックします。

  1. デフォルトの定義を以下のように置き換えます。

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}
  1. [Next] をクリックします。

7
8

インデックスが作成中であることを知らせるモーダル ウィンドウが表示されます。Close ボタンをクリックします。

9

インデックスの構築には約 1 分かかります。 作成している間、 Status列にはBuild in Progressと表示されます。 作成が完了すると、 Status列にはActiveと表示されます。


➤ [言語の選択]ドロップダウン メニューを使用して、このセクション内の例の言語を設定します。


複合演算子を使用して、2 つ以上の演算子を 1 つのクエリに結合できます。 このセクションのサンプル クエリでは、title genres複合movies 演算子を使用して、複数の演算子を使用して コレクション内の フィールドと フィールドをクエリします。

このセクションでは、Atlas クラスターに接続し、 compound演算子を使用してsample_mflix.moviesコレクションに対してサンプル クエリを実行します。

1
  1. まだ表示されていない場合は、希望するプロジェクトを含む組織を選択しますナビゲーション バーのOrganizationsメニュー

  2. まだ表示されていない場合は、ナビゲーション バーのProjectsメニューから目的のプロジェクトを選択します。

  3. まだ表示されていない場合は、サイドバーの [Clusters] をクリックします。

    [ Clusters (クラスター) ] ページが表示されます。

2

GoAtlas Searchページには、サイドバー、Data Explorer 、またはクラスターの詳細ページから できます。

  1. サイドバーで、 Services見出しの下のAtlas Searchをクリックします。

  2. [ Select data sourceドロップダウンからクラスターを選択し、[ Go to Atlas Search ] をクリックします。

    Atlas Searchページが表示されます。

  1. クラスターの [Browse Collections] ボタンをクリックします。

  2. データベースを展開し、コレクションを選択します。

  3. コレクションのSearch Indexesタブをクリックします。

    Atlas Searchページが表示されます。

  1. クラスタの名前をクリックします。

  2. [Atlas Search] タブをクリックします。

    Atlas Searchページが表示されます。

3

クエリするインデックスの右側にある [ Query ] ボタンをクリックします。

4

Edit Queryをクリックすると、 JSON形式のデフォルトのクエリ構文サンプルが表示されます。

5

このクエリは、 $searchステージでcompound演算子を使用してコレクションをクエリします。 compound演算子は次の句を使用します。

  • must 句を使用して、ワイルドカード演算子を使用して、 allèという用語で始まる映画タイトルを検索する

  • should テキスト演算子を使用してDramaジャンルの優先順位を指定する句

次のクエリをコピーして、 Query Editorに貼り付け、 Query EditorSearchボタンをクリックします。

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!"
6

Search Testerでは、返されるドキュメント内のすべてのフィールドが表示されない場合があります。 クエリパスで指定したフィールドを含むすべてのフィールドを表示するには、結果内のドキュメントを展開します。

allè のワイルドカード検索では、発音区別符号が含まれていなくても、title フィールドが alle で始まるドキュメントを返します。これは、title フィールドに使用した diacriticsFolder カスタムアナライザが、その値に文字の折りたたみを適用したためです。Atlas Search は、クエリターム allè で始まるタイトルのドキュメントを返します。これは、キーワードトークナイザを使用すると、文字列(またはフレーズ)全体が単一のトークンとしてトークン化されるためです。

または、タイトルフィールドで使用されるカスタムアナライザにおいて、キーワードトークナイザの代わりに標準トークナイザを指定することもできます。標準のトークナイザを使用すると、Atlas Search の結果には、クエリターム allè で始まるタイトル、または「Desde allè」のようにクエリタームが単語の先頭に現れるタイトルを持つドキュメントが含まれます。これをテストするには、インデックス定義を編集し、17 行目の keyword トークナイザを standard トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。

1

ターミナル ウィンドウでmongoshを開き、クラスターに接続します。 接続の詳細な手順については、「 mongosh経由での接続 」を参照してください。

2

mongoshプロンプトで次のコマンドを実行します。

use sample_mflix
3

このクエリは、 $searchステージでcompound演算子を使用してコレクションをクエリします。 compound演算子は次の句を使用します。

  • must 句を使用して、ワイルドカード演算子を使用して、 allèという用語で始まる映画タイトルを検索する

  • should テキスト演算子を使用してDramaジャンルの優先順位を指定する句

クエリは、 $projectステージを使用して次の操作を実行します。

  • titlegenresを除くすべてのフィールドを除外

  • 次のフィールドを追加: score

1db.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 トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。

1

MongoDB Compass を開き、クラスターに接続します。 接続の詳細な手順については、「 Compass 経由での接続 」を参照してください。

2

Database画面で、 sample_mflixデータベースをクリックし、 moviesコレクションをクリックします。

3

このクエリでは、次のcompound演算子句を使用してコレクションをクエリします。

  • must 句を使用して、ワイルドカード演算子を使用して、 allèという用語で始まる映画タイトルを検索する

  • should テキスト演算子を使用してDramaジャンルの優先順位を指定する句

クエリは、 $projectステージを使用して次の操作を実行します。

  • titlegenresを除くすべてのフィールドを除外

  • 次のフィールドを追加: score

MongoDB Compass でこのクエリを実行するには:

  1. [Aggregations] タブをクリックします。

  2. Select...をクリックし、ドロップダウンからステージを選択し、そのステージのクエリを追加して、次の各パイプライン ステージを構成します。 ステージを追加するには、 Add Stageをクリックします。

パイプラインステージ
クエリ

$search

{
"index": "diacritic-insensitive-tutorial",
"compound": {
"must": [{
"wildcard": {
"path": "title",
"query": "allè*",
"allowAnalyzedField": true
}
}],
"should": [{
"text": {
"query": "Drama",
"path": "genres"
}
}]
}
}

$project

{
"_id": 0,
"title": 1,
"genres": 1,
"score": {
"$meta": "searchScore"
}
}

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 トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。

1
  1. diacritic-insensitive-example という新しいディレクトリを作成し、dotnet new コマンドでプロジェクトを初期化します。

    mkdir diacritic-insensitive-example
    cd diacritic-insensitive-example
    dotnet new console
  2. .NET/C# ドライバーを依存関係としてプロジェクトに追加します。

    dotnet add package MongoDB.Driver
2
  1. Program.cs ファイルの内容を、次のコードで置き換えます。

    このコード例では、次のタスクを実行します。

    • mongodb パッケージと依存関係をインポートします。

    • Atlas クラスターへの接続を確立します。

    • 次のcompound演算子句を使用して、コレクションをクエリします。

      • must 句を使用して、ワイルドカード演算子を使用して、 allèという用語で始まる映画タイトルを検索する

      • should テキスト演算子を使用してDramaジャンルの優先順位を指定する句

      クエリは、 $projectステージを使用して次の操作を実行します。

      • titlegenresを除くすべてのフィールドを除外

      • 次のフィールドを追加: score

    • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

    1using MongoDB.Bson;
    2using MongoDB.Bson.Serialization.Attributes;
    3using MongoDB.Bson.Serialization.Conventions;
    4using MongoDB.Driver;
    5using MongoDB.Driver.Search;
    6
    7public 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[BsonIgnoreExtraElements]
    44public class MovieDocument
    45{
    46 [BsonIgnoreIfDefault]
    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}
  2. サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

3
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 トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。

1
  1. diacritic-insensitive.goという名前のファイルを作成します。

  2. 次のコードをコピーして、 diacritic-insensitive.goファイルに貼り付けます。

    このコード例では、次のタスクを実行します。

    • mongodb パッケージと依存関係をインポートします。

    • Atlas クラスターへの接続を確立します。

    • 次のcompound演算子句を使用して、コレクションをクエリします。

      • must 句を使用して、ワイルドカード演算子を使用して、 allèという用語で始まる映画タイトルを検索する

      • should テキスト演算子を使用してDramaジャンルの優先順位を指定する句

      クエリは、 $projectステージを使用して次の操作を実行します。

      • titlegenresを除くすべてのフィールドを除外

      • 次のフィールドを追加: score

    • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

    1package main
    2
    3import (
    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
    12func 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}
  3. サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

  4. 次のコマンドを実行して、コレクションをクエリします。

    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 トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。

1

junit

4.11以降のバージョン

mongodb-driver-sync

4.3.0以降のバージョン

slf4j-log4j12

1.7.30以降のバージョン

2
  1. DiacriticInsensitive.javaという名前のファイルを作成します。

  2. 次のコードをコピーして、 DiacriticInsensitive.javaファイルに貼り付けます。

    このコード例では、次のタスクを実行します。

    • mongodb パッケージと依存関係をインポートします。

    • Atlas クラスターへの接続を確立します。

    • 次のcompound演算子句を使用して、コレクションをクエリします。

      • must 句を使用して、ワイルドカード演算子を使用して、 allèという用語で始まる映画タイトルを検索する

      • should テキスト演算子を使用してDramaジャンルの優先順位を指定する句

      クエリは、 $projectステージを使用して次の操作を実行します。

      • titlegenresを除くすべてのフィールドを除外

      • 次のフィールドを追加: score

    • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

    1import static com.mongodb.client.model.Aggregates.project;
    2import static com.mongodb.client.model.Projections.*;
    3import com.mongodb.client.MongoClient;
    4import com.mongodb.client.MongoClients;
    5import com.mongodb.client.MongoCollection;
    6import com.mongodb.client.MongoDatabase;
    7import org.bson.Document;
    8import java.util.Arrays;
    9import java.util.List;
    10
    11public 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;
  3. サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

  4. 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 トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。

1

mongodb-driver-kotlin-coroutine

4.10.0以降のバージョン

2
  1. DiacriticInsensitive.ktという名前のファイルを作成します。

  2. 次のコードをコピーして、 DiacriticInsensitive.ktファイルに貼り付けます。

    このコード例では、次のタスクを実行します。

    • mongodb パッケージと依存関係をインポートします。

    • Atlas クラスターへの接続を確立します。

    • 次のcompound演算子句を使用して、コレクションをクエリします。

      • must 句を使用して、ワイルドカード演算子を使用して、 allèという用語で始まる映画タイトルを検索する

      • should テキスト演算子を使用してDramaジャンルの優先順位を指定する句

      クエリは、 $projectステージを使用して次の操作を実行します。

      • titlegenresを除くすべてのフィールドを除外

      • 次のフィールドを追加: score

    • クエリに一致するドキュメントをAggregateFlowインスタンスから出力します。

    1import com.mongodb.client.model.Aggregates.project
    2import com.mongodb.client.model.Projections.*
    3import com.mongodb.kotlin.client.coroutine.MongoClient
    4import kotlinx.coroutines.runBlocking
    5import org.bson.Document
    6
    7fun 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}
  3. サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

  4. 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 トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。

1
  1. diacritic-insensitive.jsという名前のファイルを作成します。

  2. 次のコードをコピーして、 diacritic-insensitive.jsファイルに貼り付けます。

    このコード例では、次のタスクを実行します。

    • MongoDB の Node.js ドライバーであるmongodbをインポートします。

    • Atlas クラスターへの接続を確立するためのMongoClientクラスのインスタンスを作成します。

    • 次のcompound演算子句を使用して、コレクションをクエリします。

      • must 句を使用して、ワイルドカード演算子を使用して、 allèという用語で始まる映画タイトルを検索する

      • should テキスト演算子を使用してDramaジャンルの優先順位を指定する句

      クエリは、 $projectステージを使用して次の操作を実行します。

      • titlegenresを除くすべてのフィールドを除外

      • 次のフィールドを追加: score

    • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

    1const { MongoClient } = require("mongodb");
    2
    3// Replace the uri string with your MongoDB deployment's connection string.
    4const uri =
    5 "<connection-string>";
    6
    7const client = new MongoClient(uri);
    8
    9async 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}
    43run().catch(console.dir);
  3. サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

  4. 次のコマンドを実行して、コレクションをクエリします。

    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 トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。

1
  1. diacritic-insensitive.pyという名前のファイルを作成します。

  2. 次のコードをコピーして、 diacritic-insensitive.pyファイルに貼り付けます。

    次のコード例では、次を行います。

    • pymongo、MongoDB の Python ドライバー、およびDNSシード リスト接続文字列を使用してpymongoAtlas に接続するために必要なdns モジュールをインポートします。

    • Atlas クラスターへの接続を確立するためのMongoClientクラスのインスタンスを作成します。

    • 次のcompound演算子句を使用して、コレクションをクエリします。

      • must 句を使用して、ワイルドカード演算子を使用して、 allèという用語で始まる映画タイトルを検索する

      • should テキスト演算子を使用してDramaジャンルの優先順位を指定する句

      クエリは、 $projectステージを使用して次の操作を実行します。

      • titlegenresを除くすべてのフィールドを除外

      • 次のフィールドを追加: score

    • カーソルを反復処理して、クエリに一致するドキュメントを出力します。

    1import pymongo
    2
    3# connect to your Atlas cluster
    4client = pymongo.MongoClient('<connection-string>')
    5
    6# define pipeline
    7pipeline = [
    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
    17result = client['sample_mflix']['movies'].aggregate(pipeline)
    18
    19# print results
    20for i in result:
    21 print(i)
  3. サンプルを実行する前に、<connection-string> をAtlas接続stringに置き換えます。 接続stringにデータベースユーザーの認証情報が含まれていることを確認します。 詳しくは、「ドライバーによる接続 」を参照してください。

  4. 次のコマンドを実行して、コレクションをクエリします。

    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 トークナイザに置き換えて、インデックス定義を保存し、サンプルクエリを実行します。

戻る

全ての結果