...
[WinUI] Lucene.NET ํ ์คํธ ๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๊ธฐ (1) - ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ๊ตฌ์ฑ ์์ ๋ณธ๋ฌธ
WinUI
[WinUI] Lucene.NET ํ ์คํธ ๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉํ๊ธฐ (1) - ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ๊ตฌ์ฑ ์์
tkdgh816 2025. 10. 10. 16:45๐ฉ Lucene.NET์ด๋
โญ Lucene๊ณผ Lucene.NET
- Lucene์ Apache Software Foundation์์ ๋ง๋ Java ๊ธฐ๋ฐ ๊ณ ์ฑ๋ฅ ์คํ ์์ค ํํ ์คํธ ๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. Lucene์ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ธ๋ฑ์ฑ ๋ฐ ๊ฒ์ ๊ธฐ๋ฅ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํฉํ ์ ์๊ฒ ํ๋ค. ์์ฒด์ ์ผ๋ก ์์ ํ ๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋, ๊ฒ์ ๊ธฐ๋ฅ์ ๊ตฌ์ถํ๊ธฐ ์ํ ํต์ฌ ๊ตฌ์ฑ ์์(๋ผ์ด๋ธ๋ฌ๋ฆฌ)์ด๋ค. ์ญ ์ธ๋ฑ์ค ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ๊ฒ์์ ์ง์ํ๋ค.
- ElasticSearch, OpenSearch ๋ฑ์ ์ ๋ช ๊ฒ์ ์์ง์ด Lucene ๊ธฐ๋ฐ์ผ๋ก ์ ์๋์๋ค. ์ด๋ค ๊ฒ์ ์์ง์ Lucene์ ์ฝ์ด๋ก ์ฌ์ฉํ์ฌ REST API, ๋ถ์ฐ ์ฒ๋ฆฌ, ์ค๋ฉ, ๋ฆฌํ๋ฆฌ์ผ์ด์ , ํด๋ฌ์คํฐ๋ง ๋ฑ์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์๋ค.
- Lucene์ JVM(Java, Kotlin, Scala ๋ฑ) ๊ธฐ๋ฐ์์๋ง ๋์ํ๋ค. ์ด๋ ๊ฒ ์๋ Java๋ก ์์ฑ๋ Lucene์ ๊ธฐ๋ฅ์ .NET ์ธ์ด๋ก ์ฌ์์ฑํ์ฌ .NET ๋ฐํ์์์๋ ์ฌ์ฉํ ์ ์๋๋ก .NET ํฌํ ๋ฒ์ ์ ์ ์ํ์๋๋ฐ, ์ด๊ฒ์ด Lucene.NET์ด๋ค.
- Lucene.NET์ ์ธ๋ฑ์ค, ์ฟผ๋ฆฌ, ๋ถ์๊ธฐ(Analyzer), ํ ํฐํ ๋ฑ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ API ๊ตฌ์กฐ๊ฐ Lucene๊ณผ ๊ฑฐ์ ๋์ผํ๋ค. Lucene.NET์ ๋ ๋ฆฝ ํ๋ก์ ํธ์ด์ง๋ง, Lucene์ ์ํคํ ์ฒ์ ๋ฒ์ ํธํ์ ๋ฐ๋ผ๊ฐ๋ค.
- Lucene.NET์ ๋ํ ์์ธํ ์ค๋ช ์ Apache Lucene.NET์์ ํ์ธํ ์ ์๋ค.
โญ Lucene.NET ๋ฒ์ ๊ณผ NuGet ํจํค์ง
- NuGet ํจํค์ง๋ก Lucene.NET ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ ์ ์๋ค. ํ์ฌ ์ต์ ๋ฒ์ ์ 4.8.0-beta00017๋ก NuGet ํจํค์ง ๊ด๋ฆฌ์์ "์ํํ ํฌํจ"์ ์ ํํ๋ฉด ์ต์ ์ํํ์ ๋ค์ด๋ก๋๋ฐ์ ์ ์๋ค.
- Lucene.NET์ ์ ํต์ ์ธ ํ ์คํธ ๊ฒ์(ํ ํฐํ, ์ญ์์ธ, ๋ถ์ฉ์ด ์ฒ๋ฆฌ, ๋ฌธ์ ์ ๋ ฌ ๋ฑ) ์ค์ฌ์ด๋ฉฐ, ์ต์ ๊ฒ์ ํจ๋ฌ๋ค์์๋ ํ๊ณ๊ฐ ์๋ค.
- Lucene.NET์ ๊ด๋ จ๋ ์ฌ๋ฌ NuGet ํจํค์ง๊ฐ ์๋๋ฐ ๊ธฐ๋ณธ์ ์ผ๋ก Lucene.Net, Lucene.Net.Analysis.Common, Lucene.Net.QueryParser๋ฅผ ์ค์นํ๋ค.
๐ฉ Lucene.NET ๊ตฌ์ฑ ์์ (1): ์ธ๋ฑ์ค์ ์ ๋ ฅํ๋ ๋ฐ์ดํฐ
โญ Document์ Field
- Document(๋ฌธ์): ์ธ๋ฑ์ค์ ๋์์ด ๋๋ ๊ธฐ๋ณธ ๋จ์์ด๋ค. ํ๋์ Document๋ ๊ฒ์ ๊ฐ๋ฅํ ๊ฐ์ฒด ํ๋๋ฅผ ์๋ฏธํ๋ค. Document๋ ์ฌ๋ฌ ๊ฐ์ Field๋ฅผ ๊ฐ์ง๋ค.
- ์ฌ๊ธฐ์์๋ Document๋ฅผ ํ๊ตญ์ด๋ก ๋ฒ์ญํ์ฌ "๋ฌธ์"๋ผ๊ณ ํํํ์๋ค. ์ด๋ ํ ์คํธ ๋ฐ์ดํฐ๋ ๊ธ๋ก์ ์ฌ์ฉํ๋ "๋ฌธ์"์ ์๋ฏธ๊ฐ ์๋๋ผ, Lucene.Net.Documents.Document ๊ฐ์ฒด๋ก์ ์์ ์ค๋ช ํ๋ ์ธ๋ฑ์ค์ ๋์์ด ๋๋ ๋จ์๋ฅผ ์๋ฏธํ๋ค.
- Field(ํ๋): ํ๋๋ Document์ ํ ๋ถ๋ถ์ผ๋ก, Document ๋ด๋ถ์ ์์ฑ์ด๋ค. ๊ฐ ํ๋๋ง๋ค ์ด๋ฆ, ๊ฐ, ์ ํ(์ธ๋ฑ์ค ์ฌ๋ถ, ์ ์ฅ ์ฌ๋ถ, ๊ฒ์ ๊ฐ๋ฅ ์ฌ๋ถ ๋ฑ)์ ์ง์ ํ ์ ์๋ค. ํ๋๋ ์ ํ์ ์ผ๋ก ์ธ๋ฑ์ค์ ์ ์ฅ๋์ด ๋ฌธ์์ ๋ํ ์กฐํ ๊ฒฐ๊ณผ๋ก ๋ฐํ๋ ์ ์๋ค.
- Document๊ฐ ๊ฒ์ํ ๊ธ์ด๋ผ๋ฉด, ๊ทธ ์์ ์ ๋ชฉ, ์์ฑ์, ์์ฑ ์๊ฐ, ๋ณธ๋ฌธ ๋ฑ์ Field๋ค์ ์ง์ ํ ์ ์๋ค.
Document๊ฐ์ฒด๋Lucene.Net.Documents๋ค์์คํ์ด์ค์Documentํด๋์ค ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ๋ง๋ ๋ค. ์ด๋Document๋IEnumerableํ์ ์ผ๋ก ์ปฌ๋ ์ ์ด๊ธฐ์๋กField๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ์ฌ ์ด๊ธฐํํ ์ ์๋ค. ๋ํGet,Add,RemoveField๋ฑ์ ๋ฉ์๋๋ก ํ๋๋ฅผ ํ์ธ/๋ณ๊ฒฝํ ์ ์๋ค.
using Lucene.Net.Documents;
(string Id, string Title, string Content) article = ("User Id", "Title 1", "Content 1");
Document doc = new()
{
new StringField("Id", article.Id, Field.Store.YES),
new TextField("Title", article.Title, Field.Store.YES),
new TextField("Content", article.Content, Field.Store.NO)
};
Field๊ฐ์ฒด๋Lucene.Net.Documents๋ค์์คํ์ด์ค์Fieldํด๋์ค ๋๋Field์ ํ์ ํด๋์ค ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ๋ง๋ค ์ ์๋ค.Field์ธ์คํด์ค๋ฅผ ์์ฑํ ๋๋ ์ฃผ๋ก ์ธ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋ ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ก๋ ์ฌ๋ฌ ํ๋๋ค์ ๊ตฌ๋ถํ ์์ฑํ๋ ค๋ ํ๋์ ์ด๋ฆ, ๋ ๋ฒ์งธ ์ธ์๋ก๋ ํ๋์ ์ฝ์ ํ ๊ฐ(์ฝํ ์ธ ), ์ธ ๋ฒ์งธ ์ธ์๋ก๋ ํ๋๋ฅผ ์ด๋ป๊ฒ ๋ค๋ฃฐ ๊ฒ์ธ์ง ๊ฒฐ์ ํ๋ ์ค์ ๊ฐ์ด ๋ค์ด๊ฐ๋ค.Field๊ฐ์ฒด์FieldType์์ฑ์ ์กฐ์ ํ์ฌField์ธ์คํด์ค ํ๋๋ก ๋ชจ๋ ํ์ ํด๋์ค ํ๋ ์ธ์คํด์ค๋ฅผ ๋์ฒดํ ์ ์๋ค. ํ์ ํด๋์ค๋ค์ ํ์ ์ ๊ณ ์ ํ๊ณ ํธ๋ฆฌํ ์ฌ์ฉ์ ์ํด ๋ง๋ค์ด์ง ๊ฒ์ด๋ค.FieldType์ผ๋ก ์ง์ ํ ์ ์๋ ์์ฑ์ ๋ค์๊ณผ ๊ฐ๋ค.
| ์์ฑ | ํ์ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
| DocValueType | DocValuesType Enum (BINARY, NONE, NUMERIC, SORTED, SORTED_SET) |
DocValue ๊ฐ ํ์ | NONE |
| IndexOptions | IndexOptions Enum (DOCS_AND_FREQS, DOCS_AND_FREQS_AND_POSITIONS, DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS, DOCS_ONLY, NONE) |
์ธ๋ฑ์ฑ ์ต์ | DOCS_AND_FREQS_AND_POSITIONS |
| IsIndexed | bool | ์ธ๋ฑ์ฑ ์ฌ๋ถ | false |
| IsStored | bool | ํ๋ ๊ฐ ์ ์ฅ ์ฌ๋ถ | false |
| IsTokenized | bool | ํ ํฐํ ์ฌ๋ถ | true |
| NumericPrecisionStep | int | ์ซ์ ๊ฐ ์ ํ๋ | PRECISION_STEP_DEFAULT (4) |
| NumericType | NumericType Enum (DOUBLE, INT32, INT64, SINGLE, NONE) |
์ซ์ ๊ฐ ํ์ | NONE |
| OmitNorms | bool | omit normalization | false |
| StoreTermVectorOffsets | bool | false | |
| StoreTermVectorPayloads | bool | false | |
| StoreTermVectorPositions | bool | false | |
| StoreTermVectors | bool | false |
Field์ ํ์ ํด๋์ค๋ค์ ํฌ๊ฒ ๊ฒ์ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ์ธ๋ฑ์ฑ ํ๋์, ๊ฒ์์ฉ์ด ์๋ ๋ค๋ฅธ ์ฉ๋์ธ ๋น์ธ๋ฑ์ฑ ํ๋์ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ์ธ๋ฑ์ฑ ํ๋์, ๊ฒ์์ฉ์ด ์๋ ๋ค๋ฅธ ์ฉ๋์ธ ๋น์ธ๋ฑ์ฑ ํ๋๋ก ๋๋๋ค.- ์ธ๋ฑ์ฑ ํ๋: ์ธ๋ฑ์ฑ ํ๋๋ ํ๋ ๊ฐ ํ์ ์ ๋ฐ๋ผ ๋๋ ์ ์๋ค.
| ํ๋(Field) | ํ๋ ๊ฐ ํ์ (CLR) | ์ค๋ช | ํน์ง |
| StringField | string | ๋ฌธ์์ด ๊ฐ์ ์ธ๋ฑ์ฑํ๋ ํ
์คํธ ํ๋ ํ ์คํธ๋ฅผ ํ ํฐํํจ |
์ ์ฒด ๋ฌธ์์ด ๊ฐ์ด ๋จ์ผ ํ ํฐ์ผ๋ก ์ธ๋ฑ์ฑ๋จ |
| TextField | string | ๋ฌธ์์ด ๊ฐ์ ์ธ๋ฑ์ฑํ๋ ํ
์คํธ ํ๋ ํ ์คํธ๋ฅผ ํ ํฐํํจ |
ํ ํฐํํ์ฌ ์ธ๋ฑ์ฑํ์ง๋ง TermVector๋ ์ ์ฅํ์ง ์์ |
| Int32Field | int | int ๊ฐ์ ์ธ๋ฑ์ฑํ๋ ํ๋ | ํจ์จ์ ์ธ ๋ฒ์ ํํฐ๋ง ๋ฐ ์ ๋ ฌ์ ์ฌ์ฉ |
| Int64Field | long | long ๊ฐ์ ์ธ๋ฑ์ฑํ๋ ํ๋ | ํจ์จ์ ์ธ ๋ฒ์ ํํฐ๋ง ๋ฐ ์ ๋ ฌ์ ์ฌ์ฉ |
| SingleField | float | float ๊ฐ์ ์ธ๋ฑ์ฑํ๋ ํ๋ | ํจ์จ์ ์ธ ๋ฒ์ ํํฐ๋ง ๋ฐ ์ ๋ ฌ์ ์ฌ์ฉ |
| DoubleField | double | double ๊ฐ์ ์ธ๋ฑ์ฑํ๋ ํ๋ | ํจ์จ์ ์ธ ๋ฒ์ ํํฐ๋ง ๋ฐ ์ ๋ ฌ์ ์ฌ์ฉ |
- ๋น์ธ๋ฑ์ฑ ํ๋: ๋น์ธ๋ฑ์ฑ ํ๋๋ ์ ์ฅ ๊ตฌ์กฐ์ ๋ฐ๋ผ Document์ Field ๊ธฐ๋ฐ์ผ๋ก ๋๋ ์ ์๋ค.
- Document(ํ) ๊ธฐ๋ฐ: ๋ฌธ์ ๋จ์๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ค. ํน์ ํ๋๋ง ์กฐํํ๋ ค๋ฉด ํด๋น ๋ฌธ์๋ฅผ ๋์ฝ๋ฉํด์ผ ํ๋ค. ๋ฐ๋ผ์ ๋๋ค ์ ๊ทผ์ ๊ฐ๋ฅํ์ง๋ง ์์ฐจ ์ ๊ทผ์ ๋นํจ์จ์ ์ด๋ค. ๊ฒ์ ๊ฒฐ๊ณผ ๋ฐํ์ฉ์ผ๋ก ์ค๊ณ๋์๋ค.
- Field(์ด) ๊ธฐ๋ฐ: ํ๋๋ณ๋ก ๋ชจ๋ ๋ฌธ์ ๊ฐ์ด ์ฐ์ ๋ฐฐ์ด๋ก ์ ์ฅ๋์ด
DocID์ ๊ฐ ๋งคํ์ด ๋น ๋ฅด๋ค. ๋น ๋ฅธ ๊ฐ ์กฐํ, ๋๋ ์์ฐจ ์ ๊ทผ, ํ์ฒ๋ฆฌ, ์ ๋ ฌ/๊ทธ๋ฃนํ์ ํจ์จ์ ์ด๋ค. ๊ฒ์ ๊ณผ์ ๊ณผ ํ์ฒ๋ฆฌ์ฉ์ผ๋ก ์ค๊ณ๋์๋ค.
| ํ๋(Field) | ์ ์ฅ ๊ตฌ์กฐ | ํ๋ ๊ฐ ํ์ | ์ค๋ช | ํน์ง |
| StoredField | Document(ํ) ๊ธฐ๋ฐ | ๋ชจ๋ ํ์
(string, int, long, float, double, BytesRef) |
d | d |
| BinaryDocValuesField ๋ฐ ํ์ |
Field(์ด) ๊ธฐ๋ฐ | BytesRef | d | d |
| NumericDocValuesField ๋ฐ ํ์ |
Field(์ด) ๊ธฐ๋ฐ | ์ซ์ ํ์
(byte, short, int, long, float, double) |
d | d |
| SortedDocValuesField ๋ฐ ํ์ |
Field(์ด) ๊ธฐ๋ฐ | BytesRef | d | d |
| SortedSetDocValuesField | Field(์ด) ๊ธฐ๋ฐ | BytesRef | d | d |
๐ฉ Lucene.NET ๊ตฌ์ฑ ์์ (2): ์ธ๋ฑ์ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๋ ๋ฐฉ์
โญ Token๊ณผ Term
- Token(ํ ํฐ): Token์ Analyzer๊ฐ ์๋ณธ ํ ์คํธ๋ฅผ ๋ถ์ํ ๋ ๋ง๋ค์ด๋ด๋ ์ค๊ฐ ์ฐ์ถ๋ฌผ์ด๋ค. ํ ์คํธ ๋ฐ์ดํฐ๋ ๊ฒ์์ ์ํด ์ด๊ธฐ์ ํ ์คํธ๋ฅผ ๋ถ์ํ์ฌ ์ด๊ฒ์ ์์ ๋จ์๋ก ๋ถํดํ๋ ๊ณผ์ ์ ์ํํ๋ค. ์ด๋ ์ด ๋ถํด๋ ์กฐ๊ฐ์ Token์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. Token์ Analyzer ๋จ๊ณ์์๋ง ์กด์ฌํ๋ ์์ ๊ฐ์ฒด์ด๋ฉฐ, ์ค์ ์ธ๋ฑ์ค์๋ ์ ์ฅ๋์ง ์๋๋ค.
- ์๋ฅผ ๋ค์ด "The quick brown fox jumps"์ ๊ฐ์ ์๋ณธ ํ ์คํธ ๋ฐ์ดํฐ๊ฐ ์๋ค๊ณ ํ์. Analyzer๊ฐ ์ด ํ ์คํธ๋ฅผ ๋ถ์ํ ๋, ๋จ์ด ๋จ์๋ก ๋ฌธ์ฅ์ ์ชผ๊ฐ ํ ๋๋ฌธ์๋ฅผ ๋ชจ๋ ์๋ฌธ์๋ก ๋ฐ๊พผ๋ค. ๊ทธ๋ฆฌ๊ณ "the"์ ๊ฐ์ ๋ถ์ฉ์ด๋ฅผ ์ ๊ฑฐํ๊ณ "jumps"์ ๊ฐ์ ๋ฌธ๋ฒ์ ๋จ์ด์์ "jump"๋ผ๋ ํ์ ์ด๋ฅผ ์ถ์ถ(lemmatization)ํ๋ค. ๊ทธ ๊ฒฐ๊ณผ๋ก "quick", "brown", "fox", "jump"์ ๊ฐ์ ๋จ์ด๋ค์ ์ป์ ์ ์๋ค. ์ด๋ ๊ฒ ์ป์ ๋จ์ด ํ๋ํ๋๋ฅผ Token์ด๋ผ๊ณ ํ๊ณ , ์ด Token๋ค์ ๋ชจ๋ ๋ชจ์ ๋ฌถ์(์ปฌ๋ ์ )์ TokenStream์ด๋ผ๊ณ ํ๋ค.
- Term(ํ ): Term์ Token์ ๊ธฐ๋ฐ์ผ๋ก ์ธ๋ฑ์ค์ ์ค์ ๋ก ์ ์ฅ๋๋ ๊ฒ์ ๋จ์์ด๋ค. Term์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋๋ช ๊ณผ ํ ์คํธ์ ์กฐํฉ์ผ๋ก ์ ์๋๋ฉฐ ์ธ๋ฑ์ค์๋ Term์ด ์ฌ์ ํํ๋ก ์ ์ฅ๋๋ค. ์ธ๋ฑ์ค์์ ๋ฌธ์๋ฅผ ๊ฒ์ํ ๋ ๊ฒ์ ์ฟผ๋ฆฌ๋ Term ๋จ์๋ก ์ด๋ฃจ์ด์ง๋ค.
- ์๋ฅผ ๋ค์ด ์ด๋ค Document์ "body"๋ผ๋ Field์ ๊ฐ์ด "The quick brown fox jumps"๋ผ๊ณ ํ์. ์ธ๋ฑ์ฑ ์ Analyzer๊ฐ ํธ์ถ๋์ด ํ
์คํธ๋ฅผ ํ ํฐํํ์ฌ "quick", "brown", "fox", "jump"์ ๊ฐ์ด ๋ง๋ ๋ค. ๊ฐ ํ ํฐ๋ค์ Term์ผ๋ก ๊ฐ์ฃผ๋์ด ๋ค์๊ณผ ๊ฐ์ด
Field์Text์์ฑ์ด ํฌํจ๋Term๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ธ๋ฑ์ค์ ์ ์ฅํ๋ค.
// ์ค์ ๊ฐ์ฒด ๊ตฌ์กฐ๊ฐ ์๋ ๋
ผ๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ํํํจ
Term body:quick (Field -> "body", Text -> "quick")
Term body:brown (Field -> "body", Text -> "brown")
Term body:fox (Field -> "body", Text -> "fox")
Term body:jump (Field -> "body", Text -> "jump")
- ๊ทธ ๋ค์ ์ธ๋ฑ์๋ ํ์ฌ Document์ ๋ํด ๊ฐ Term์ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ค. ๊ทธ ์ ๋ณด์๋ ํ์ฌ ๋ฌธ์์ Id(DocId), Term์ด ๋ฌธ์์์ ๋ฐ์ํ ๋น๋(Frequency), ๋ฐ์ ์์น(Position), ํ ์คํธ์ ๋ฒ์(Offset) ๋ฑ์ด ์ ํ์ ์ผ๋ก ์ ์ฅ๋๋ค.
- ๊ฒ์ ์ ์ฟผ๋ฆฌ ๋ฌธ์์ด(๊ฒ์์ด)๊ฐ ๋ค์ด์ค๋ฉด ๊ทธ ๋ฌธ์์ด๋ Analyzer๋ก ์ฒ๋ฆฌํ์ฌ Term์ ์์ฑํ๋ค. ๊ทธ Term์ ๊ธฐ๋ฐ์ผ๋ก ์ธ๋ฑ์ค์์ ์ผ์นํ๋ Term์ ์ฐพ์ ์ ์๊ณ ๊ทธ Term์ ํด๋นํ๋ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ ์ด๋ ๋ฌธ์, ์ด๋ ์์น์ ์กด์ฌํ๋์ง ์กฐํํ ์ ์๋ค.
โญ Analyzer
- Analyzer(๋ถ์๊ธฐ): ํ ์คํธ๋ฅผ ๋ถ์ํ์ฌ ์์ธ, ๊ฒ์ ๊ฐ๋ฅํ ํ ํฐ๋ค์ ์งํฉ์ธ TokenStream์ ์์ฑํ๋ ์ ์ฑ (ํ์ดํ๋ผ์ธ)์ด๋ค. ํ์ดํ๋ผ์ธ์ ์ผ๋ฐ์ ์ผ๋ก CharFilter -> Tokenizer -> TokenFilter ํํ๋ก ๋์ํ๊ณ , ๊ฐ ๋จ๊ณ๋ ํ ์คํธ๋ฅผ ์ ๊ทํ, ๋ถํด, ๊ฐ๊ณตํ๋ค.
- CharFilter: ์๋ณธ ํ
์คํธ๋ฅผ ๋ฌธ์ ๋จ์๋ก ์ฝ์
, ์ญ์ , ์นํํ์ฌ ์ ์ฒ๋ฆฌํ๋ค. HTML ํ๊ทธ๋ฅผ ์ ๊ฑฐ(
HTMLStripCharFilter)ํ๊ฑฐ๋, ํน์ ๋ฌธ์์ด์ ์นํํ๊ณ ์ถ์ฝ์ด๋ฅผ ํ์ฅ(MappingCharFilter)ํ๊ฑฐ๋, ๋ฌธ์ฅ๋ถํธ๋ฅผ ๊ณต๋ฐฑ์ผ๋ก ์นํํ๋ ๋ฑ Tokenizer๊ฐ ํ ์คํธ๋ฅผ TokenStream์ผ๋ก ๋ถ๋ฆฌํ๊ธฐ ์ ๋ ์ ๋ถ๋ฆฌํ ์ ์๋๋ก ์๋ณธ ํ ์คํธ๋ฅผ ์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํ๋ค. CharFilter๋ ์ฐ์์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ ๋ด๋ถ์ ์ผ๋ก ์คํ์ ๋ณด์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ค. - Lucene.NET
Analyzerํด๋์ค์์๋InitReader๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ๋ฉ์๋ ์ธ์๋ก ๋ฐ์TextReader๊ฐ์ฒด๋ฅผCharFilter๋ก ๋ํํ์ฌ ๋ค์TextReader๊ฐ์ฒด๋ก ๋ฐํํ ์ ์๋๋ก ์ง์ํ๋ค. ์ด๋,TextReader๋ .NET์System.IO.TextReader๋ฅผ ์๋ฏธํ๋ค.
// CharFilter๋ฅผ ์ ์ฉ์ํฌ Analyzer ํด๋์ค์ ๊ฐ์ ๋ฉ์๋
protected virtual TextReader InitReader(string fieldName, TextReader reader)
- TokenStream: Document์ ํ๋ ๋๋ ์ฟผ๋ฆฌ ํ
์คํธ์์ ํ ํฐ ์ํ์ค๋ฅผ ๋์ดํ๋ ๊ฐ์ฒด์ด๋ค.
TokenStreamํด๋์ค๋ ์ถ์ ํด๋์ค๋ก, ํ์ ํด๋์ค๋กTokenizer์TokenFilterํด๋์ค๋ฅผ ๊ฐ์ง๋ค.Tokenizer๋TextReader๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ๋TokenStream์ด๊ณ ,TokenFilter๋ ๋ค๋ฅธTokenStream์ ์ ๋ ฅ์ผ๋ก ๋ฐ๋TokenStream์ด๋ค. TokenStreamํด๋์ค๋AttributeSourceํด๋์ค์ ํ์ ํด๋์ค๋ก์, ๋ค์ํAttribute(ํน์ฑ) ๋ชฉ๋ก๊ณผ ํน์ฑ์ ์ถ๊ฐํ๊ณ ๊ฐ์ ธ์ค๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์๋ค.TokenStreamํด๋์ค์ ํน์ฑ์ ์ถ๊ฐํ๊ณ ์ค์ ํจ์ผ๋ก์จ ํ ํฐ์ ํน์ฑ์ ์ง์ ํ ์ ์๋ค.- TokenStream์ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ํ ํฐ๊ณผ ๊ทธ์ ๋ง๋ ํ ํฐ ํน์ฑ์ ์์ฑํ๋ค. ์ธ ๋ฉ์๋๋ ๋ชจ๋ ์ค๋ฒ๋ผ์ด๋ ๊ฐ๋ฅํ๋ค.
Reset()๋ฉ์๋: TokenStream์ด ์๋ก์ด ์ ๋ ฅ์ ์ฒ๋ฆฌํ ์ค๋น๋ฅผ ํ๋ ๋จ๊ณ์ด๋ค. ์ด์ ํ ํฐ ์ํ๋ฅผ ์ด๊ธฐํํ๊ณ , TokenStream์ด ์ ๋ ฅ์ ์ฒ์๋ถํฐ ์ฝ๋๋ก ์ค์ ํ๋ค.IncrementToken()๋ฉ์๋: ์ค์ ๋ก ํ ํฐ์ ์์ฑํ๊ณ ๋ณํํ๋ ๋จ๊ณ์ด๋ค. ๊ทธ ๋ค์ ์คํธ๋ฆผ์ ๋ค์ ํ ํฐ์ผ๋ก ์ด๋์ํจ๋ค. ํ ํฐ์ ์ฌ๋ฌ TokenStream ์ฒด์ธ์ ํ ํ ํฐ์ฉ ํต๊ณผํ๋ค. ๋ฉ์๋ ๋ด๋ถ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก TokenStream ๋ด๋ถ ์ํ๋ฅผ ๊ฐฑ์ ํ๋ค(์ค๋ฒ๋ผ์ด๋ ์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ํ๊ฒ ์ฒ๋ฆฌํ๋ค).- ๋ฉ์๋ ํธ์ถ ์ ๋ค์ ํ ํฐ์ด ์์ผ๋ฉด
true๋ฅผ ๋ฐํํ๊ณ ๋์ด์ ํ ํฐ์ด ์์ผ๋ฉดfalse๋ฅผ ๋ฐํํ๋ค. - ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ๋์ ํ ํฐ์ ์์ฑํ๊ณ ํ ํฐ ํน์ฑ(term, offset, position ๋ฑ์ attribute)์ ์๋ก์ด ํ ํฐ์ ๋ง๊ฒ ๊ฐฑ์ ํ๋ค.
- ํน์ฑ์ ์ง์ ํ๊ธฐ ์ ๊ธฐ์กด ํน์ฑ์
ClearAttribute()๋ฉ์๋๋ก ์ด๊ธฐํํ ํ, ํ์ํ ํน์ฑ์ ์ค์ ํ๊ณ ๋ค์ ํ ํฐ ์กด์ฌ ์ฌ๋ถ์ ๋ฐ๋ผtrueํน์false๋ฅผ ๋ฐํํ๋ค. - ํ ํฐ ์์ฑ์ ํ ํฐ(ํน์ ํ
) ํ
์คํธ๋ฅผ ์ง์ ํ๋
ICharTermAttribute, ํ ์ ์์น(์คํ์ )์ ์ง์ ํ๋IOffsetAttribute, ํ ํฐ์ ํ์ (๋จ์ด, ์ซ์ ๋ฑ)์ ์ง์ ํ๋ITypeAttribute๋ฑ์ด ์๋ค.
- ๋ฉ์๋ ํธ์ถ ์ ๋ค์ ํ ํฐ์ด ์์ผ๋ฉด
End()๋ฉ์๋: TokenStream์ด ๋ง์ง๋ง ํ ํฐ์ ์ฒ๋ฆฌํ ํ ์ ๋ฆฌํ๋ ๋จ๊ณ์ด๋ค. ๋ง์ง๋ง ์คํ์ ์ค์ , ๋ฆฌ์์ค ์ ๋ฆฌ ๋ฑ์ ์คํธ๋ฆผ ์ข ๋ฃ ์์ ์ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- Tokenizer: ์๋ณธ ํ
์คํธ ๋๋ CharFilter๋ก ๋ํ๋
TextReader๋ฅผ ์ฝ์ด ํ ์คํธ๋ฅผ ํ ํฐ๋ค๋ก ๋ถํดํ๋ค. ํ ํฐ์ ๋ถํดํ ๋ ํ ํฐ ๊ฒฝ๊ณ๋ฅผ ๊ฒฐ์ ํ๊ณ , ํ ํฐ ๋จ์์ ํน์ฑ์ ์ถ๊ฐํ๋ค. Tokenizer๋TextReader๋ฅผ ๋ฐ์์TokenStream์ ๋ฐํํ๋ฏ๋ก Analyzer ํ์ดํ๋ผ์ธ์์ ๋ด๋ถ์์ ์ฒ์ ํ ๋ฒ๋ง ์ํ๋๋ค. - TokenFilter: Tokenizer๋ก ๋ถํด๋ ๊ธฐ์กด ํ ํฐ๋ค์ ๋ณํ, ํํฐ๋งํ๋ ์ญํ ์ ํ๋ค. ํ ํฐ ํ
์คํธ๋ฅผ ๋ณํํ๊ฑฐ๋, ๋ถํ์ํ ํ ํฐ์ ์ ๊ฑฐํ๊ณ , ๋ ์์ ํ ํฐ์ผ๋ก ๋ถํดํ๋ ๋ฑ ๊ธฐ์กด
TokenStream์ ๋ฐ์์ ๋ณํ ํ ์๋ก์ดTokenStream์ ๋ฐํํ๋ค. Analyzer ํ์ดํ๋ผ์ธ์์ Tokenizer์ ํ์ ๋จ๊ณ๋ค๋ก ์ฌ๋ฌ TokenFilter๋ฅผ ์ค์ฒฉํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
