Docs Menu
Docs Home
/ /

문자 필터

문자 필터는 텍스트를 한 번에 한 문자씩 검사하고 필터링 작업을 수행합니다. 문자 필터에는 유형 필드가 필요하며, 일부 필터에는 추가 옵션도 필요합니다.

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

MongoDB Search는 다음 유형의 문자 필터하다 지원합니다.

  • htmlStrip

  • icuNormalize

  • 매핑

  • 페르시아어

다음 샘플 인덱스 정의 및 쿼리는 라는 샘플 컬렉션 minutes 사용합니다. 이 예제를 따라 진행하려면 minutes 클러스터 에서 컬렉션 Create a Search Index 로드하고 MongoDB 검색 인덱스 만들기 튜토리얼의 단계에 따라 Atlas UI 의 페이지로 이동합니다. 그런 다음 minutes 컬렉션 데이터 소스 로 선택하고 예시 절차에 따라 Atlas UI 에서 또는 를 사용하여 인덱스 mongosh 생성합니다.


언어 선택 드롭다운 메뉴를 사용하여 이 페이지의 예제 실행 메서드를 설정하다.


htmlStrip 문자 필터는 HTML 구성을 제거합니다.

htmlStrip 문자 필터하다 에는 다음과 같은 속성이 있습니다.

이름
유형
필수 사항입니다.
설명

type

문자열

이 문자 필터 유형을 식별하는 사람이 읽을 수 있는 레이블입니다. 값은 htmlStrip 이어야 합니다.

ignoredTags

문자열 배열

필터링에서 제외할 HTML 태그가 포함된 목록입니다.

다음 인덱스 정의 예제에서는 htmlStrippingAnalyzer 이라는 사용자 지정 분석기를 사용하여 회의록 collection의 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_USField Name 드롭다운에서, Data Type 드롭다운의 문자열과 함께 선택합니다.

  11. 데이터 유형의 속성 섹션에 있는 Index AnalyzerSearch Analyzer 드롭다운에서 htmlStrippingAnalyzer 선택합니다.

  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)

다음 쿼리는 head text.en_US minutes collection의 필드에서 문자열의 발생을 찾습니다.

  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>"
}
}
]

문자열 head 이(가) HTML 태그를 지정하다 <head>의 일부이기 때문에 MongoDB Search는 _id: 1 이(가) 포함된 문서 를 반환하지 않습니다. _id: 3 이 있는 문서 에 HTML 태그가 포함되어 있지만 head 문자열이 다른 곳에 있으므로 문서 일치합니다. 다음 표는 MongoDB Search가 htmlStrippingAnalyzer를 사용하여 minutes 컬렉션의 문서 _id: 1, _id: 2, _id: 3text.en_US 필드 값에 대해 생성하는 토큰을 보여줍니다.

문서 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

문자 필터는 ICU 정규화 도구로 텍스트를 icuNormalize 정규화합니다. 이는 Lucene의 ICUNormalizer2CharFilter를 기반으로 합니다.

icuNormalize 문자 필터에는 다음과 같은 속성이 있습니다.

이름
유형
필수 사항입니다.
설명

type

문자열

이 문자 필터 유형을 식별하는 사람이 읽을 수 있는 레이블입니다. 값은 icuNormalize 이어야 합니다.

다음 인덱스 정의 예제에서는 normalizingAnalyzer 이라는 사용자 지정 분석기를 사용하여 회의록 collection의 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 드롭다운에서 문자열을 선택합니다.

  10. 데이터 유형에 대한 속성 섹션의 Index AnalyzerSearch Analyzer 드롭다운에서 normalizingAnalyzer 를 선택합니다.

  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": []
}
]
})

다음 쿼리는 no message minutes collection의 필드에서 문자열 (숫자)의 발생을 검색합니다.

  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 "number ". MongoDB Search는 normalizingAnalyzer을 사용하여 문서 _id: 4message 필드 값에 대해 다음 토큰을 생성합니다.

문서 ID
출력 토큰

_id: 4

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

mapping 문자 필터하다 사용자가 지정한 정규화 매핑을 문자에 적용합니다. Lucene의 MappingCharFilter를 기반으로 합니다.

mapping 문자 필터하다 에는 다음과 같은 속성이 있습니다.

이름
유형
필수 사항입니다.
설명

type

문자열

이 문자 필터 유형을 식별하는 인간 가독형 레이블입니다.

값은 mapping이어야 합니다.

mappings

객체

쉼표로 구분된 매핑 목록을 포함하는 객체입니다. 매핑은 한 문자 또는 문자 그룹을 <original> : <replacement> 형식으로 다른 문자로 대체해야 함을 나타냅니다.

다음 인덱스 정의 예제에서는 mappingAnalyzer 이라는 사용자 지정 분석기를 사용하여 회의록 collection의 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을(를) 선택하고 을(를) 클릭하세요.

  6. Original 필드에 다음 문자를 한 번에 하나씩 입력하고 해당 Replacement 필드는 비워 둡니다.

    원본
    교체

    -

    .

    (

    )

    {SPACE}

  7. Add character filter를 클릭합니다.

  8. Tokenizer 이 접혀 있는 경우 확장하고 드롭다운에서 keyword 를 선택합니다.

  9. 인덱스에 사용자 지정 분석기를 추가하려면 Add 을 클릭합니다.

  10. Field Mappings 섹션에서 Add Field Mapping을 클릭하여 page_updated_by.phone(중첩) 필드에 사용자 정의 분석기를 적용합니다.

  11. Field Name 드롭다운에서 page_updated_by.phone(중첩)을 선택하고, Data Type 드롭다운에서 String을 선택하세요.

  12. 데이터 유형의 속성 섹션에 있는 Index AnalyzerSearch Analyzer 드롭다운에서 mappingAnalyzer 선택합니다.

  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 필드에서 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 결과에는 phone 문자열의 숫자가 쿼리 문자열과 일치하는 하나 문서 포함되어 있습니다. {MongoDB} 문자 필터하다 사용하여 이러한 문자를 제거하고 단일 토큰을 생성했기 때문에 쿼리 mapping 에 전화번호 지역 번호와 숫자 사이의 하이픈이 포함되지 않았더라도 MongoDB Search는 문서 를 쿼리 문자열과 일치시켰습니다. 필드 값. 구체적으로 MongoDB Search는 _id: 1을(를) 사용하여 문서 의 phone 필드 에 대해 다음 토큰을 생성했습니다.

문서 ID
출력 토큰

_id: 1

1234567890

또한 MongoDB Search _id: 1 (123)-456-7890123-456-7890MongoDB,, 123.456.7890 등의 검색에 대해 이( 분석기 searchAnalyzer) 포함된 문서 일치시킵니다 . 지정된 경우 사용). 다음 표는 MongoDB Search가 쿼리 에서 하이픈(-), 점(.), 여는 괄호((), 닫는 괄호( )) 및 공백 문자의 인스턴스를 제거하여 생성하는 토큰을 보여줍니다. 텀:

쿼리 용어
출력 토큰

(123)-456-7890

1234567890

123-456-7890

1234567890

123.456.7890

1234567890

The persian 문자 필터하다 너비가 0인 비조이너 의 인스턴스를 공백 문자로 바꿉니다. 이 문자 필터하다 Lucene의 PersianCharFilter를 기반으로 합니다.

persian 문자 필터에는 다음과 같은 속성이 있습니다.

이름
유형
필수 사항입니다.
설명

type

문자열

이 문자 필터 유형을 식별하는 사람이 읽을 수 있는 레이블입니다. 값은 persian 이어야 합니다.

다음 인덱스 정의 예제에서는 persianCharacterIndex 이라는 사용자 지정 분석기를 사용하여 회의록 collection의 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.fa_IR (중첩) 필드에 사용자 지정 분석기를 적용합니다.

  9. text.fa_IR (중첩)Field Name 드롭다운에서 선택하고 Data Type 드롭다운에서 문자열을 선택합니다.

  10. 데이터 유형에 대한 속성 섹션의 Index AnalyzerSearch Analyzer 드롭다운에서 persianCharacterIndex 를 선택합니다.

  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는 먼저 너비가 0인 비조이너의 인스턴스를 공백 문자로 바꾼 다음 단어 사이의 공백 발생 여부에 따라 필드 값의 각 단어에 대한 개별 토큰을 생성하여 쿼리 텀 문서 와 일치시킵니다. 구체적으로 MongoDB Search는 _id: 2이 있는 문서 에 대해 다음과 같은 토큰을 생성합니다.

문서 ID
출력 토큰

_id: 2

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

mapping 문자 필터를 사용하는 추가 인덱스 정의 및 쿼리를 보려면 다음 참조 페이지 예시를 참조하세요.

돌아가기

관습

이 페이지의 내용