Docs Menu
Docs Home
/ /

文字フィルター

文字フィルターは、テキストを一度に 1 文字ずつ検査し、フィルタリング操作を実行します。 文字フィルターにはタイプ フィールドが必要で、一部の文字フィルターには追加のオプションも使われます。

構文
"charFilters": [
{
"type": "<filter-type>",
"<additional-option>": <value>
}
]

MongoDB Search は次のタイプの文字フィルターをサポートしています。

  • htmlStop

  • icuNormalize

  • マッピング

  • ペルシャ語

次のサンプルインデックス定義とクエリでは、 という名前の minutesサンプルコレクションを使用します。これらの例に従うには、クラスターにminutes コレクションをロードし、 「Create a Search Index MongoDB Search インデックスの作成 」チュートリアルの手順に従って、Atlas UIの ページに移動します。次に、データソースとしてminutes コレクションを選択し、例手順に従って、Atlas UIまたはmongosh を使用してインデックスを作成します。


言語を選択 ドロップダウン メニューを使用して、このページの例を実行する方法を設定します。


htmlStrip文字フィルターは HTML 構造を削除します。

htmlStrip文字フィルターには次の属性があります。

名前
タイプ
必須
説明

type

string

はい

この文字フィルター型を識別する、人間が判読できるラベル。 値はhtmlStripである必要があります。

ignoredTags

文字列の配列

はい

フィルタリングから除外する HTML タグを含むリスト。

次のインデックス定義の例では、 htmlStrippingAnalyzerという名前のカスタムアナライザを使用して、コレクションのtext.en_USフィールドにインデックスを作成します。 カスタムアナライザは、以下を指定します。

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

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

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

  4. Character Filtersを展開し、 をクリックしますAdd character filter

  5. ドロップダウンから [ htmlStripを選択し、 ignoredTagsフィールドにaと入力します。

  6. [Add character filter] をクリックします。

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

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

  9. Field Mappingsセクションで、 Add Field Mappingをクリックしてtext.en_USにカスタムアナライザを適用します ネストされたフィールド。

  10. text.en_US を選択 Field Nameドロップダウンからネストされたstringと、 Data Typeドロップダウンからネストされた string 。

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

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

デフォルトのインデックス定義を以下のように置き換えます。

1 {
2 "mappings": {
3 "fields": {
4 "text": {
5 "type": "document",
6 "dynamic": true,
7 "fields": {
8 "en_US": {
9 "analyzer": "htmlStrippingAnalyzer",
10 "type": "string"
11 }
12 }
13 }
14 }
15 },
16 "analyzers": [{
17 "name": "htmlStrippingAnalyzer",
18 "charFilters": [{
19 "type": "htmlStrip",
20 "ignoredTags": ["a"]
21 }],
22 "tokenizer": {
23 "type": "standard"
24 },
25 "tokenFilters": []
26 }]
27 }
1db.minutes.createSearchIndex(
2 "default",
3 {
4 "mappings": {
5 "fields": {
6 "text": {
7 "type": "document",
8 "dynamic": true,
9 "fields": {
10 "en_US": {
11 "analyzer": "htmlStrippingAnalyzer",
12 "type": "string"
13 }
14 }
15 }
16 }
17 },
18 "analyzers": [
19 {
20 "name": "htmlStrippingAnalyzer",
21 "charFilters": [
22 {
23 "type": "htmlStrip",
24 "ignoredTags": ["a"]
25 }
26 ],
27 "tokenizer": {
28 "type": "standard"
29 },
30 "tokenFilters": []
31 }
32 ]
33 }
34)

次のクエリは、 minutesコレクションのtext.en_USフィールドで string headの出現を検索します。

  1. インデックスの Query ボタンをクリックします。

  2. クエリを編集するには、Edit Query をクリックします。

  3. クエリ バーをクリックし、データベースとコレクションを選択します。

  4. デフォルトのクエリを以下のように置き換え、Find をクリックします。

    {
    "$search": {
    "text": {
    "query": "head",
    "path": "text.en_US"
    }
    }
    }
    SCORE: 0.32283568382263184 _id: “2
    message: "do not forget to SIGN-IN. See ① for details."
    page_updated_by: Object
    last_name: "OHRBACH"
    first_name: "Noël"
    email: "ohrbach@example.com"
    phone: "(123) 456 0987"
    text: Object
    en_US: "The head of the sales department spoke first."
    fa_IR: "ابتدا رئیس بخش فروش صحبت کرد"
    sv_FI: "Först talade chefen för försäljningsavdelningen"
    SCORE: 0.3076632022857666 _id: “3
    message: "try to sign-in"
    page_updated_by: Object
    last_name: "LEWINSKY"
    first_name: "Brièle"
    email: "lewinsky@example.com"
    phone: "(123).456.9870"
    text: Object
    en_US: "<body>We'll head out to the conference room by noon.</body>"
1db.minutes.aggregate([
2 {
3 "$search": {
4 "text": {
5 "query": "head",
6 "path": "text.en_US"
7 }
8 }
9 },
10 {
11 "$project": {
12 "_id": 1,
13 "text.en_US": 1
14 }
15 }
16])
[
{
_id: 2,
text: { en_US: "The head of the sales department spoke first." }
},
{
_id: 3,
text: {
en_US: "<body>We'll head out to the conference room by noon.</body>"
}
}
]

MongoDB Search では、文字列 head が HTML タグ <head> の一部であるため、_id: 1 を含むドキュメントは返されません。 _id: 3 を含むドキュメントには HTML タグが含まれていますが、文字列 head は他の場所にあるため、ドキュメントは一致します。 次の表は、htmlStrippingAnalyzer を使用して、コレクション内のドキュメント _id: 1_id: 2_id: 3text.en_USフィールド値に対してMongoDB Search が生成するトークンを示しています。

ドキュメント ID
出力トークン

_id: 1

This, page, deals, with, department, meetings

_id: 2

The, head, of, the, sales, department, spoke, first

_id: 3

We'll, head, out, to, the, conference, room, by, noon

icuNormalize 文字フィルターは、ICU 正規表現を使用してテキストを正規化します。これは、 Lucene のICUNormazer2CharFilterに基づいています。

icuNormalize 文字フィルターには次の属性があります。

名前
タイプ
必須
説明

type

string

はい

この文字フィルター型を識別する、人間が判読できるラベル。 値はicuNormalizeである必要があります。

次のインデックス定義の例では、 normalizingAnalyzerという名前のカスタムアナライザを使用して、コレクションのmessageフィールドにインデックスを作成します。 カスタムアナライザは、以下を指定します。

  • icuNormalize文字フィルターを使用して、 messageフィールド値のテキストを正規化します。

  • 空白トークナイザ を使用して、単語間の空白の発生に基づいてフィールド内の単語をトークン化します。

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

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

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

  4. Character Filtersを展開し、 をクリックしますAdd character filter

  5. ドロップダウンから [ icuNormalizeを選択し、[ Add character filter ] をクリックします。

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

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

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

  9. Field Name ドロップダウンからメッセージを選択し、Data Type ドロップダウンからstringを選択します。

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

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

デフォルトのインデックス定義を以下のように置き換えます。

1{
2 "mappings": {
3 "fields": {
4 "message": {
5 "type": "string",
6 "analyzer": "normalizingAnalyzer"
7 }
8 }
9 },
10 "analyzers": [
11 {
12 "name": "normalizingAnalyzer",
13 "charFilters": [
14 {
15 "type": "icuNormalize"
16 }
17 ],
18 "tokenizer": {
19 "type": "whitespace"
20 },
21 "tokenFilters": []
22 }
23 ]
24}
db.minutes.createSearchIndex("default", {
"mappings": {
"fields": {
"message": {
"type": "string",
"analyzer": "normalizingAnalyzer"
}
}
},
"analyzers": [
{
"name": "normalizingAnalyzer",
"charFilters": [
{
"type": "icuNormalize"
}
],
"tokenizer": {
"type": "whitespace"
},
"tokenFilters": []
}
]
})

次のクエリは、 minutesコレクションのmessageフィールドで string no (数値)の出現を検索します。

  1. インデックスの Query ボタンをクリックします。

  2. クエリを編集するには、Edit Query をクリックします。

  3. クエリ バーをクリックし、データベースとコレクションを選択します。

  4. デフォルトのクエリを以下のように置き換え、Find をクリックします。

    {
    "$search": {
    "text": {
    "query": "no",
    "path": "message"
    }
    }
    }
    SCORE: 0.4923309087753296 _id: “4
    message: "write down your signature or phone №"
    page_updated_by: Object
    last_name: "LEVINSKI"
    first_name: "François"
    email: "levinski@example.com"
    phone: "123-456-8907"
    text: Object
    en_US: "<body>This page has been updated with the items on the agenda.</body>"
    es_MX: "La página ha sido actualizada con los puntos de la agenda."
    pl_PL: "Strona została zaktualizowana o punkty porządku obrad."
1db.minutes.aggregate([
2 {
3 "$search": {
4 "text": {
5 "query": "no",
6 "path": "message"
7 }
8 }
9 },
10 {
11 "$project": {
12 "_id": 1,
13 "message": 1,
14 "title": 1
15 }
16 }
17])
[
{
_id: 4,
title: 'The daily huddle on tHe StandUpApp2',
message: 'write down your signature or phone №'
}
]

MongoDB Search が _id: 4 を含むドキュメントをクエリタームno と照合したのは、icuNormalize 文字フィルターを使用してフィールドの数字記号 を正規化し、「数字」という単語のその型上の省略形用のトークン no を作成したためです。 ".MongoDB Search は、normalizingAnalyzer を使用して、ドキュメント_id: 4messageフィールド値に対して次のトークンを生成します。

ドキュメント ID
出力トークン

_id: 4

write, down, your, signature, or, phone, no

mapping文字フィルターは、文字にユーザー指定の正規化マッピングを適用します。これは Lucene の MappingCharFilter に基づいています。

mapping文字フィルターには次の属性があります。

名前
タイプ
必須
説明

type

string

はい

この文字フィルタータイプを識別する、人間が判読できるラベル。

値はmappingでなければなりません。

mappings

オブジェクト

はい

マッピングのコンマ区切りリストを含むオブジェクト。 マッピングは、ある文字または文字のグループを別の文字に置き換える必要があることを<original> : <replacement>形式で示します。

次のインデックス定義の例では、 mappingAnalyzerという名前のカスタムアナライザを使用して、コレクションのpage_updated_by.phoneフィールドにインデックスを作成します。 カスタムアナライザは、以下を指定します。

  • mapping文字フィルターを使用して、ハイフン( - )、ドット( . )、開始括弧( ( )、閉じ括弧( ) )、電話フィールド内の空白文字を削除します。

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

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

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

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

  4. Character Filtersを展開し、 をクリックしますAdd character filter

  5. ドロップダウンからmappingを選択し、 をクリックします。 Add mapping

  6. Originalフィールドに次の文字を 1 つずつ入力し、対応するReplacementフィールドは空のままにします。

    元の
    replacement

    -

    .

    (

    )

    {SPACE}

  7. [Add character filter] をクリックします。

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

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

  10. Field MappingsセクションでAdd Field Mappingをクリックして、ページ_update_by . 電話(ネストされた)フィールドにカスタムアナライザを適用します。

  11. Field Nameドロップダウンからpage_update_by. 電話ネストされた)を選択し、 Data Typeドロップダウンからstringを選択します。

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

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

デフォルトのインデックス定義を以下のように置き換えます。

1{
2 "mappings": {
3 "fields": {
4 "page_updated_by": {
5 "fields": {
6 "phone": {
7 "analyzer": "mappingAnalyzer",
8 "type": "string"
9 }
10 },
11 "type": "document"
12 }
13 }
14 },
15 "analyzers": [
16 {
17 "name": "mappingAnalyzer",
18 "charFilters": [
19 {
20 "mappings": {
21 "-": "",
22 ".": "",
23 "(": "",
24 ")": "",
25 " ": ""
26 },
27 "type": "mapping"
28 }
29 ],
30 "tokenizer": {
31 "type": "keyword"
32 }
33 }
34 ]
35}
1db.minutes.createSearchIndex(
2 "default",
3 {
4 "mappings": {
5 "fields": {
6 "page_updated_by": {
7 "fields": {
8 "phone": {
9 "analyzer": "mappingAnalyzer",
10 "type": "string"
11 }
12 },
13 "type": "document"
14 }
15 }
16 },
17 "analyzers": [
18 {
19 "name": "mappingAnalyzer",
20 "charFilters": [
21 {
22 "mappings": {
23 "-": "",
24 ".": "",
25 "(": "",
26 ")": "",
27 " ": ""
28 },
29 "type": "mapping"
30 }
31 ],
32 "tokenizer": {
33 "type": "keyword"
34 }
35 }
36 ]
37 }
38)

次のクエリは、 page_updated_by.phoneフィールドで string 1234567890を検索します。

  1. インデックスの Query ボタンをクリックします。

  2. クエリを編集するには、Edit Query をクリックします。

  3. クエリ バーをクリックし、データベースとコレクションを選択します。

  4. デフォルトのクエリを以下のように置き換え、Find をクリックします。

    {
    "$search": {
    "text": {
    "query": "1234567890",
    "path": "page_updated_by.phone"
    }
    }
    }
    SCORE: 0.5472603440284729 _id: “1
    message: "try to siGn-In"
    page_updated_by: Object
    last_name: "AUERBACH"
    first_name: "Siân"
    email: "auerbach@example.com"
    phone: "(123)-456-7890"
    text: Object
    en_US: "<head> This page deals with department meetings.</head>"
    sv_FI: "Den här sidan behandlar avdelningsmöten"
    fr_CA: "Cette page traite des réunions de département"
1db.minutes.aggregate([
2 {
3 "$search": {
4 "text": {
5 "query": "1234567890",
6 "path": "page_updated_by.phone"
7 }
8 }
9 },
10 {
11 "$project": {
12 "_id": 1,
13 "page_updated_by.phone": 1,
14 "page_updated_by.last_name": 1
15 }
16 }
17])
[
{
_id: 1,
page_updated_by: { last_name: 'AUERBACH', phone: '(123)-456-7890' }
}
]

MongoDB Search 結果には、phonestring 内の数値がクエリ文字列と一致する 1 つのドキュメントが含まれます。 MongoDB Search は、クエリにドキュメントをクエリ文字列と一致させました。ただし、クエリに電話番号を囲む括弧と数字の間にあるハイフンが含まれていない場合でも、 MongoDB Search は mapping 文字フィルターを使用してこれらの文字を削除し、フィールド値。 具体的には、 MongoDB Search は、_id: 1 を使用してドキュメントの phoneフィールドに対して次のトークンを生成しました。

ドキュメント ID
出力トークン

_id: 1

1234567890

MongoDB Search は、(123)-456-7890123-456-7890123.456.7890 などの検索でも、_id: 1 を持つドキュメントと一致します。 string フィールドにインデックスを付ける方法 では、 MongoDB Search はインデックス検索クエリー(または指定されている場合は searchAnalyzer を使用)。次の表は、ハイフン(-)、ドット(.)、開始括弧(()、閉じ括弧())、クエリ内の空白文字のインスタンスを削除してMongoDB Search が作成するトークンを示しています。ターム:

クエリ用語
出力トークン

(123)-456-7890

1234567890

123-456-7890

1234567890

123.456.7890

1234567890

persian 文字フィルターは、ゼロ幅非結合のインスタンスをスペース文字に置き換えます。この文字フィルターは、 Lucene のPersianCharFilterに基づいています。

persian 文字フィルターには次の属性があります。

名前
タイプ
必須
説明

type

string

はい

この文字フィルター型を識別する、人間が判読できるラベル。 値はpersianである必要があります。

次のインデックス定義の例では、 persianCharacterIndexという名前のカスタムアナライザを使用して、コレクションのtext.fa_IRフィールドにインデックスを作成します。 カスタムアナライザは、以下を指定します。

  • persian文字フィルターを適用して、フィールド値内の印刷以外の文字をスペース文字に置き換えます。

  • ホワイトスペーストークナイザ を使用して、単語間の空白の発生に基づいてトークンを作成します。

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

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

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

  4. Character Filtersを展開し、 をクリックしますAdd character filter

  5. ドロップダウンから [ persianを選択し、[ Add character filter ] をクリックします。

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

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

  8. Field Mappingsセクションで、 Add Field Mappingをクリックしてtext.fi_IRにカスタムアナライザを適用します (ネストされた)フィールド。

  9. text.FA_IR を選択します Field Name ドロップダウンからは (ネストされた)、Data Type ドロップダウンからはstringを使用します。

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

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

デフォルトのインデックス定義を以下のように置き換えます。

1{
2 "analyzer": "lucene.standard",
3 "mappings": {
4 "fields": {
5 "text": {
6 "dynamic": true,
7 "fields": {
8 "fa_IR": {
9 "analyzer": "persianCharacterIndex",
10 "type": "string"
11 }
12 },
13 "type": "document"
14 }
15 }
16 },
17 "analyzers": [
18 {
19 "name": "persianCharacterIndex",
20 "charFilters": [
21 {
22 "type": "persian"
23 }
24 ],
25 "tokenizer": {
26 "type": "whitespace"
27 }
28 }
29 ]
30}
db.minutes.createSearchIndex("default", {
"analyzer": "lucene.standard",
"mappings": {
"fields": {
"text": {
"dynamic": true,
"fields": {
"fa_IR": {
"analyzer": "persianCharacterIndex",
"type": "string"
}
},
"type": "document"
}
}
},
"analyzers": [
{
"name": "persianCharacterIndex",
"charFilters": [
{
"type": "persian"
}
],
"tokenizer": {
"type": "whitespace"
}
}
]
})

次のクエリは、text.fa_IR フィールドで صحبت というタームを検索します。

  1. インデックスの Query ボタンをクリックします。

  2. クエリを編集するには、Edit Query をクリックします。

  3. クエリ バーをクリックし、データベースとコレクションを選択します。

  4. デフォルトのクエリを以下のように置き換え、Find をクリックします。

    {
    "$search": {
    "text": {
    "query": "صحبت",
    "path": "text.fa_IR"
    }
    }
    }
    SCORE: 0.13076457381248474 _id: “2
    message: "do not forget to SIGN-IN. See ① for details."
    page_updated_by: Object
    last_name: "OHRBACH"
    first_name: "Noël"
    email: "ohrbach@example.com"
    phone: "(123) 456 0987"
    text: Object
    en_US: "The head of the sales department spoke first."
    fa_IR: "ابتدا رئیس بخش فروش صحبت کرد"
    sv_FI: "Först talade chefen för försäljningsavdelningen"
1db.minutes.aggregate([
2 {
3 "$search": {
4 "text": {
5 "query": "صحبت",
6 "path": "text.fa_IR"
7 }
8 }
9 },
10 {
11 "$project": {
12 "_id": 1,
13 "text.fa_IR": 1,
14 "page_updated_by.last_name": 1
15 }
16 }
17])
[
{
_id: 2,
page_updated_by: { last_name: 'OHRBACH' },
text: { fa_IR: 'ابتدا رئیس بخش فروش صحبت کرد' }
}
]

MongoDB Search では、クエリタームを含む _id: 2ドキュメントが返されます。MongoDB Search は、まずゼロ幅非結合のインスタンスをスペースドキュメントに置き換え、次に単語間の空白の発生に基づいてフィールド値内の各単語の個別のトークンを作成することで、クエリタームをドキュメントと照合します。具体的には、 MongoDB Search は、_id: 2 を持つドキュメントに対して次のトークンを生成します。

ドキュメント ID
出力トークン

_id: 2

ابتدا, رئیس, بخش, فروش, صحبت, کرد

mapping 文字フィルターを使用する追加のインデックス定義とクエリを確認するには、次の参照ページの例をご覧ください。

戻る

カスタム

項目一覧