為您的使用個案選擇正確的分析儀

本指南著重於選擇分析儀的實際決策。有關分析儀組件的技術細節以及如何新增分析儀參數,請參閱分析儀總覽

在 2 分鐘內瞭解分析儀

在 Milvus 中,分析器會處理儲存在此欄位中的文字,使其可搜尋全文搜尋(BM25)、短語匹配文字匹配等功能。把它想像成一個文字處理器,將您的原始內容轉換成可搜尋的符號。

分析器以簡單的兩階段管道運作:

Analyzer Workflow 分析器工作流程

  1. 標記化 (必要):這個初始階段會套用標記化程式,將連續的文字串分割成離散、有意義的單位,稱為標記。標記化方法會因語言和內容類型的不同而有很大的差異。

  2. 標記篩選 (選用):在標記化之後,會套用篩選器來修改、移除或精細化標記。這些作業可包括將所有標記轉換為小寫,移除常見的無意義的字詞 (例如停止字),或將字詞還原為其字根形式 (字幹化)。

範例

Input: "Hello World!" 
       1. Tokenization → ["Hello", "World", "!"]
       2. Lowercase & Punctuation Filtering → ["hello", "world"]

為何分析器的選擇很重要

選擇錯誤的分析器可能會使相關的文件無法搜尋或傳回不相關的結果。

下表總結了分析器選擇不當所導致的常見問題,並提供診斷搜尋問題的可行解決方案。

問題

症狀

範例 (輸入與輸出)

原因 (不良分析器)

解決方案 (好的分析器)

過度漢字化

技術術語、識別符或 URL 的文字查詢無法找到相關文件。

  • "user_id"['user', 'id']

  • "C++"['c']

standard分析器

使用 whitespace標記器;結合 alphanumonly過濾器。

標記化不足

搜尋多字詞組的元件時,無法返回包含完整詞組的文件。

"state-of-the-art"['state-of-the-art']

帶有 whitespace標記器

使用 standardtokenizer 來分割標點符號和空格;使用自訂regex過濾器。

語言不匹配

特定語言的搜尋結果不合理或不存在。

中文文本: "机器学习"['机器学习'] (一個符記)

english分析器

使用特定語言的分析器,例如 chinese.

第一個問題您需要選擇分析器嗎?

對於許多用例,您不需要做任何特別的事情。讓我們來判斷您是否是其中之一。

預設行為:standard 分析器

如果您在使用全文檢索等文字檢索功能時沒有指定分析器,Milvus 會自動使用 standard分析器。

standard 分析器:

  • 在空格和標點符號上分割文字

  • 將所有字元轉換為小寫

  • 移除一套內建的常見英文停止詞和大部分標點符號

轉換範例

Input:  "The Milvus vector database is built for scale!"
Output: ['the', 'milvus', 'vector', 'database', 'is', 'built', 'scale']

判定標準:快速檢查

使用此表快速判斷預設的standard 分析器是否符合您的需求。如果不符合,您就需要選擇不同的路徑。

您的內容

標準分析器可以嗎?

為什麼

您的需求

英文部落格文章

✅ 是

預設行為已足夠。

使用預設 (不需要設定)。

中文文件

❌ 否

中文單字沒有空格,會視為一個符記。

使用內建的 chinese分析器。

技術文件

❌否

標點符號會從詞彙中刪除,例如C++

使用 whitespacetokenizer 和 alphanumonly過濾器。

空格分隔的語言,如法語/西班牙語文字

⚠️ 可能

重音字元 (café vs.cafe) 可能不匹配。

建議使用具有 asciifolding建議使用自訂的分析器,以獲得更好的結果。

多語言或未知語言

❌否

standard 分析器缺乏處理不同字元集和標記化規則所需的特定語言邏輯。

使用自訂分析器與 icutokenizer 進行單一碼感知 tokenization。

或者,考慮設定多語言分析器語言識別器,以更精確地處理多語言內容。

如果預設的standard 分析器無法滿足您的需求,您需要實作一個不同的分析器。您有兩種途徑:

路徑 A:使用內建分析器

內建分析器是針對一般語言預先設定的解決方案。當預設標準分析器不適合時,它們是最簡單的入門方法。

可用的內建分析器

分析器

語言支援

元件

備註

standard

多數以空格分隔的語言 (英文、法文、德文、西班牙文等)

  • Tokenizer:standard

  • 過濾器:lowercase

用於初始文字處理的通用分析器。對於單一語言的情況,特定語言的分析器 (如english) 可提供更好的效能。

english

專用於英語,可應用詞幹處理和停止詞移除,以達到更好的英語語意匹配。

  • 標記器:standard

  • 過濾器:lowercase,stemmerstop

建議使用於純英文內容,超過standard

chinese

中文

  • Tokenizer:jieba

  • 篩選器:cnalphanumonly

目前預設使用簡體中文字典。

實作範例

要使用內建分析器,只需在定義欄位模式時,在analyzer_params 中指定其類型。

# Using built-in English analyzer
analyzer_params = {
    "type": "english"
}

# Applying analyzer config to target VARCHAR field in your collection schema
schema.add_field(
    field_name='text',
    datatype=DataType.VARCHAR,
    max_length=200,
    enable_analyzer=True,
    analyzer_params=analyzer_params,
)

詳細用法請參閱全文檢索文字匹配片語匹配

路徑 B:建立自訂分析器

當內建的選項無法滿足您的需求時,您可以結合 tokenizer 與一組過濾器來建立自訂分析器。這可讓您完全控制文字處理管道。

步驟 1:根據語言選擇標記器

根據內容的主要語言選擇您的標記器:

西方語言

對於空格分隔的語言,您有這些選項:

標記器

如何運作

最適用於

範例

standard

根據空格和標點符號分割文字

一般文字、混合標點符號

  • 輸入:"Hello, world! Visit example.com"

  • 輸出:['Hello', 'world', 'Visit', 'example', 'com']

whitespace

僅根據空白字元分割

預先處理的內容、使用者格式化的文字

  • 輸入:"user_id = get_user_data()"

  • 輸出:['user_id', '=', 'get_user_data()']

東亞語言

以字典為基礎的語言需要專門的 tokenizer 來進行適當的單字分割:

中文

標記器

如何運作

最適用於

範例

jieba

以中文字典為基礎,搭配智慧型演算法進行分割

建議用於中文內容- 結合字典與智慧型演算法,專為中文設計

  • 輸入:"机器学习是人工智能的一个分支"

  • 輸出:['机器', '学习', '是', '人工', '智能', '人工智能', '的', '一个', '分支']

lindera

以中文字典為基礎的純字典形態分析(cc-cedict)

jieba 相比,以更通用的方式處理中文文本

  • 輸入:"机器学习算法"

  • 輸出:["机器", "学习", "算法"]

日語和韓語

語言

代碼器

字典選項

最適合

範例

日語

lindera

ipadic(通用)、ipadic-neologd(現代術語)、unidic(學術)

搭配專有名詞處理的語法分析

  • 輸入:"東京都渋谷区"

  • 輸出:["東京", "都", "渋谷", "区"]

韓語

lindera

ko-dic

韓語形態分析

  • 輸入:"안녕하세요"

  • 輸出:["안녕", "하", "세요"]

多語言或未知語言

適用於文件中語言不可預測或混合的內容:

標記器

如何運作

最適用於

範例

icu

統一碼感知標記化 (統一碼國際元件)

混合腳本、未知語言,或簡單的標記化已經足夠時

  • 輸入:"Hello 世界 مرحبا"

  • 輸出:['Hello', ' ', '世界', ' ', 'مرحبا']

何時使用 icu

  • 混合語言,語言識別不切實際。

  • 您不需要多語言分析器語言識別器的開銷。

  • 內容以一種主要語言為主,偶爾會出現一些對整體意義的貢獻不大的外文字詞 (例如,英文文本中會出現零星的日文或法文品牌名稱或技術術語)。

替代方法:若要更精確地處理多語言內容,可考慮使用多語言分析器或語言識別器。如需詳細資訊,請參閱多語言分析器語言識別器

步驟 2:新增精確度過濾器

選擇您的標記器後,請根據您的特定搜尋需求和內容特徵套用篩選器。

常用篩選器

這些篩選器對於大多數空格分隔的語言配置 (英文、法文、德文、西班牙文等) 來說是不可或缺的,並可大幅改善搜尋品質:

篩選器

如何運作

何時使用

範例

lowercase

將所有字元轉換為小寫

通用 - 適用於所有有大小寫區分的語言

  • 輸入:["Apple", "iPhone"]

  • 輸出:[['apple'], ['iphone']]

stemmer

將單字還原為字根形式

有詞彙轉折的語言 (英文、法文、德文等)

適用於英文:

  • 輸入:["running", "runs", "ran"]

  • 輸出:[['run'], ['run'], ['ran']]

stop

移除常見的無意義的單字

大多數語言 - 對於空格分隔的語言尤其有效

  • 輸入:["the", "quick", "brown", "fox"]

  • 輸出:[[], ['quick'], ['brown'], ['fox']]

對於東亞語言 (中文、日文、韓文等),請改用特定語言的篩選器。這些語言通常使用不同的方法來處理文字,可能無法從字幹處理中獲得顯著的效益。

文字規範化篩選器

這些篩選器會將文字變化標準化,以改善匹配的一致性:

篩選器

如何運作

何時使用

範例

asciifolding

將重音字元轉換為 ASCII 對應字元

國際內容、使用者產生的內容

  • 輸入:["café", "naïve", "résumé"]

  • 輸出:[['cafe'], ['naive'], ['resume']]

符號篩選

根據字元內容或長度控制哪些字元會被保留:

過濾

如何運作

何時使用

範例

removepunct

移除獨立的標點符記

清除jieba,lindera,icu tokenizers 的輸出,這些 tokenizers 會將標點符號作為單一符號返回

  • 輸入:["Hello", "!", "world"]

  • 輸出:[['Hello'], ['world']]

alphanumonly

只保留字母和數字

技術內容,乾淨的文字處理

  • 輸入:["user123", "test@email.com"]

  • 輸出:[['user123'], ['test', 'email', 'com']]

length

移除指定長度範圍以外的標記

過濾雜訊 (過長的文字)

  • 輸入:["a", "very", "extraordinarily"]

  • 輸出: [['a'], ['very'], []] (如果max=10)

regex

自訂模式篩選

特定領域的符記要求

  • 輸入:["test123", "prod456"]

  • 輸出: [[], ['prod456']] (ifexpr="^prod")

特定語言過濾器

這些篩選器處理特定的語言特性:

篩選器

語言

如何運作

範例

decompounder

德語

將複合詞分割成可搜尋的元件

  • 輸入:["dampfschifffahrt"]

  • 輸出:[['dampf', 'schiff', 'fahrt']]

cnalphanumonly

中文

保留中文字 + 字母數字

  • 輸入:["Hello", "世界", "123", "!@#"]

  • 輸出:[['Hello'], ['世界'], ['123'], []]

cncharonly

中文

只保留中文字元

  • 輸入:["Hello", "世界", "123"]

  • 輸出:中文[[], ['世界'], []]

步驟 3:合併並執行

要建立您的自訂分析器,您必須在analyzer_params 字典中定義 tokenizer 和篩選器清單。篩選器會依列出的順序套用。

# Example: A custom analyzer for technical content
analyzer_params = {
    "tokenizer": "whitespace",
    "filter": ["lowercase", "alphanumonly"]
}

# Applying analyzer config to target VARCHAR field in your collection schema
schema.add_field(
    field_name='text',
    datatype=DataType.VARCHAR,
    max_length=200,
    enable_analyzer=True,
    analyzer_params=analyzer_params,
)

最後:使用測試run_analyzer

在套用到集合之前,請務必先驗證您的設定:

# Sample text to analyze
sample_text = "The Milvus vector database is built for scale!"

# Run analyzer with the defined configuration
result = client.run_analyzer(sample_text, analyzer_params)
print("Analyzer output:", result)

要檢查的常見問題:

  • 過度標示:技術術語分割不正確

  • 標示不足:詞組未適當分隔

  • 遺漏標記:重要詞彙被篩選出來

詳細用法請參閱run_analyzer

本節針對在 Milvus 中使用分析器時的常見用例,提供推薦的標記器和過濾器配置。請選擇最符合您的內容類型和搜尋需求的組合。

在將分析器套用到您的收集之前,我們建議您使用 run_analyzer來測試和驗證文字分析效能。

有重音符號的語言 (法文、西班牙文、德文等)

使用standard 記錄器並搭配小寫轉換、特定語言的詞彙縮寫和停止字移除。透過修改languagestop_words 參數,此設定也適用於其他歐洲語言。

# French example
analyzer_params = {
    "tokenizer": "standard",
    "filter": [
        "lowercase", 
        "asciifolding",  # Handle accent marks
        {
            "type": "stemmer",
            "language": "french"
        },
        {
            "type": "stop",
            "stop_words": ["_french_"]
        }
    ]
}

# For other languages, modify the language parameter:
# "language": "spanish" for Spanish
# "language": "german" for German
# "stop_words": ["_spanish_"] or ["_german_"] accordingly

英文內容

適用於具有全面過濾功能的英文文字處理。您也可以使用內建的 english分析器:

analyzer_params = {
    "tokenizer": "standard",
    "filter": [
        "lowercase",
        {
            "type": "stemmer",
            "language": "english"
        },
        {
            "type": "stop",
            "stop_words": ["_english_"]
        }
    ]
}

# Equivalent built-in shortcut:
analyzer_params = {
    "type": "english"
}

中文內容

使用jieba tokenizer 並套用字元過濾器,僅保留中文字元、拉丁字母和數字。

analyzer_params = {
    "tokenizer": "jieba",
    "filter": ["cnalphanumonly"]
}

# Equivalent built-in shortcut:
analyzer_params = {
    "type": "chinese"
}

對於簡體中文,cnalphanumonly ,除中文字元、字母數字文字和數字外,移除所有標記。這可防止標點符號影響搜尋品質。

日文內容

使用lindera tokenizer 與日文字典和過濾器來清除標點符號和控制符號長度:

analyzer_params = {
    "tokenizer": {
        "type": "lindera",
        "dict": "ipadic"  # Options: ipadic, ipadic-neologd, unidic
    },
    "filter": [
        "removepunct",  # Remove standalone punctuation
        {
            "type": "length",
            "min": 1,
            "max": 20
        }
    ]
}

韓文內容

與日文類似,使用lindera tokenizer 與韓文字典:

analyzer_params = {
    "tokenizer": {
        "type": "lindera",
        "dict": "ko-dic"
    },
    "filter": [
        "removepunct",
        {
            "type": "length",
            "min": 1,
            "max": 20
        }
    ]
}

混合或多語內容

當處理跨越多種語言或使用腳本難以預測的內容時,請從icu 分析器開始。此 Unicode 感知分析器可有效處理混合腳本和符號。

基本多語言配置 (無詞幹):

analyzer_params = {
    "tokenizer": "icu",
    "filter": ["lowercase", "asciifolding"]
}

進階多語言處理

為了更好地控制不同語言的符號行為:

與文字檢索功能整合

選擇您的分析器後,您可以將它與 Milvus 提供的文字檢索功能整合。

  • 全文檢索

    分析器透過稀疏向量的產生,直接影響以 BM25 為基礎的全文檢索。索引和查詢使用相同的分析器,以確保標記化的一致性。特定語言的分析器通常比一般的分析器提供更好的 BM25 評分。有關實施的詳細資訊,請參閱全文檢索。

  • 文字匹配

    文字匹配作業會根據您的分析器輸出,在查詢和索引內容之間執行精確的符號匹配。如需實施細節,請參閱文字匹配

  • 短語匹配

    短語匹配需要在多字表述中進行一致的標記化,以維持短語邊界和意義。如需實施細節,請參閱短語匹配