Scegliere l'analizzatore giusto per il proprio caso d'uso

Questa guida si concentra sulle decisioni pratiche per la scelta dell'analizzatore. Per i dettagli tecnici sui componenti dell'analizzatore e su come aggiungere i parametri dell'analizzatore, consultare la sezione Panoramica dell'analizzatore.

Capire gli analizzatori in 2 minuti

In Milvus, un analizzatore elabora il testo memorizzato in questo campo per renderlo ricercabile con funzioni quali la ricerca full text (BM25), la corrispondenza di frasi o la corrispondenza di testo. Si tratta di un elaboratore di testo che trasforma i contenuti grezzi in token ricercabili.

Un analizzatore funziona in una semplice pipeline a due fasi:

Analyzer Workflow Flusso di lavoro dell'analizzatore

  1. Tokenizzazione (necessaria): Questa fase iniziale applica un tokenizer per scomporre una stringa continua di testo in unità discrete e significative, chiamate token. Il metodo di tokenizzazione può variare significativamente a seconda della lingua e del tipo di contenuto.

  2. Filtraggio dei token (opzionale): Dopo la tokenizzazione, vengono applicati dei filtri per modificare, rimuovere o perfezionare i token. Queste operazioni possono includere la conversione di tutti i token in minuscolo, la rimozione di parole comuni senza significato (come le stopword) o la riduzione delle parole alla loro radice (stemming).

Esempio:

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

Perché la scelta dell'analizzatore è importante

La scelta dell'analizzatore sbagliato può rendere i documenti rilevanti non ricercabili o restituire risultati irrilevanti.

La tabella seguente riassume i problemi più comuni causati da una scelta impropria dell'analizzatore e fornisce soluzioni praticabili per diagnosticare i problemi di ricerca.

Problema

Sintomo

Esempio (input e output)

Causa (analizzatore errato)

Soluzione (buon analizzatore)

Eccessiva tokenizzazione

Le query di testo per termini tecnici, identificatori o URL non riescono a trovare i documenti pertinenti.

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

  • "C++"['c']

standard analizzatore

Utilizzare un whitespace tokenizer; combinarlo con un alphanumonly filtro.

Sottokenizzazione

La ricerca di un componente di una frase di più parole non restituisce i documenti contenenti la frase completa.

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

Analizzatore con un whitespace tokenizer

Utilizzare un standard per dividere su punteggiatura e spazi; utilizzare un filtro regex personalizzato.

Disadattamento della lingua

I risultati della ricerca per una lingua specifica sono insensati o inesistenti.

Testo cinese: "机器学习"['机器学习'] (un token)

english analizzatore

Utilizzare un analizzatore specifico per la lingua, come ad esempio chinese.

Prima domanda: È necessario scegliere un analizzatore?

Per molti casi d'uso, non è necessario fare nulla di speciale. Vediamo se siete tra questi.

Comportamento predefinito: analizzatore standard

Se non si specifica un analizzatore quando si usano funzioni di recupero del testo come la ricerca full text, Milvus usa automaticamente l'analizzatore standard ...l'analizzatore.

L'analizzatore standard:

  • Divide il testo in base agli spazi e alla punteggiatura

  • Converte tutti i token in minuscolo

  • Rimuove una serie di stop word inglesi comuni e la maggior parte della punteggiatura.

Esempio di trasformazione:

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

Criteri decisionali: Un rapido controllo

Utilizzare questa tabella per determinare rapidamente se l'analizzatore predefinito di standard soddisfa le proprie esigenze. Se così non fosse, dovrete scegliere un'altra strada.

Il vostro contenuto

L'analizzatore standard va bene?

Perché

Cosa vi serve

Messaggi del blog in inglese

Il comportamento predefinito è sufficiente.

Utilizzare il comportamento predefinito (non è necessaria alcuna configurazione).

Documenti in cinese

❌ No

Le parole cinesi non hanno spazi e vengono trattate come un unico token.

Utilizzare un analizzatore chinese analizzatore integrato.

Documentazione tecnica

❌ No

La punteggiatura viene eliminata da termini come C++.

Creare un analizzatore personalizzato con un whitespace tokenizer e un alphanumonly filtro.

Lingue separate dallo spazio, come il testo francese/spagnolo

⚠️ Forse

I caratteri accentati (café vs. cafe) potrebbero non corrispondere.

Per ottenere risultati migliori, si consiglia di utilizzare un analizzatore personalizzato con l'opzione asciifolding per ottenere risultati migliori.

Lingue multilingue o sconosciute

❌ No

L'analizzatore standard non dispone della logica specifica della lingua necessaria per gestire set di caratteri e regole di tokenizzazione diversi.

Utilizzare un analizzatore personalizzato con il icu per una tokenizzazione consapevole degli unicode.

In alternativa, si può pensare di configurare analizzatori multilingue o un identificatore di lingua per una gestione più precisa dei contenuti multilingue.

Se l'analizzatore predefinito di standard non è in grado di soddisfare le proprie esigenze, è necessario implementarne uno diverso. Si hanno due strade:

Percorso A: Utilizzare gli analizzatori integrati

Gli analizzatori integrati sono soluzioni preconfigurate per i linguaggi più comuni. Sono il modo più semplice per iniziare quando l'analizzatore standard predefinito non è perfetto.

Analizzatori integrati disponibili

Analizzatore

Supporto per la lingua

Componenti

Note

standard

La maggior parte delle lingue separate da spazi (inglese, francese, tedesco, spagnolo, ecc.)

  • Tokenizzatore: standard

  • Filtri: lowercase

Analizzatore generico per l'elaborazione iniziale del testo. Per gli scenari monolingui, gli analizzatori specifici per la lingua (come english) offrono prestazioni migliori.

english

Dedicato all'inglese, che applica lo stemming e la rimozione delle stop word per una migliore corrispondenza semantica con l'inglese.

  • Tokenizzatore: standard

  • Filtri: lowercase, stemmer, stop

Consigliato per contenuti solo in inglese rispetto a standard.

chinese

Cinese

  • Tokenizzatore: jieba

  • Filtri: cnalphanumonly

Attualmente utilizza il dizionario cinese semplificato per impostazione predefinita.

Esempio di implementazione

Per usare un analizzatore integrato, è sufficiente specificarne il tipo in analyzer_params quando si definisce lo schema dei campi.

# 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,
)

Per un uso dettagliato, fare riferimento a Ricerca a testo intero, Corrispondenza di testo o Corrispondenza di frase.

Percorso B: Creare un analizzatore personalizzato

Quando le opzioni integrate non soddisfano le vostre esigenze, potete creare un analizzatore personalizzato combinando un tokenizer con una serie di filtri. In questo modo si ha il pieno controllo della pipeline di elaborazione del testo.

Passo 1: Selezionare il tokenizer in base alla lingua

Scegliere il tokenizer in base alla lingua principale del contenuto:

Lingue occidentali

Per le lingue con spazi separati, sono disponibili queste opzioni:

Tokenizzatore

Come funziona

Ideale per

Esempi

standard

Suddivide il testo in base agli spazi e ai segni di punteggiatura

Testo generico, punteggiatura mista

  • Ingresso: "Hello, world! Visit example.com"

  • Uscita: ['Hello', 'world', 'Visit', 'example', 'com']

whitespace

Suddivide solo in base ai caratteri di spazio

Contenuto pre-elaborato, testo formattato dall'utente

  • Ingresso: "user_id = get_user_data()"

  • Uscita: ['user_id', '=', 'get_user_data()']

Lingue dell'Asia orientale

Le lingue basate su dizionari richiedono tokenizer specializzati per una corretta segmentazione delle parole:

Cinese

Tokenizzatore

Come funziona

Ideale per

Esempi

jieba

Segmentazione basata sul dizionario cinese con algoritmo intelligente

Consigliato per i contenuti in cinese - combina il dizionario con algoritmi intelligenti, progettati specificamente per il cinese

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

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

lindera

Analisi morfologica basata su dizionario puro con dizionario cinese(cc-cedict)

Rispetto a jieba, elabora il testo cinese in modo più generico.

  • Ingresso: "机器学习算法"

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

Giapponese e coreano

Lingua

Tokenizzatore

Opzioni del dizionario

Migliore per

Esempi

Giapponese

lindera

ipadico (uso generale), ipadico-neologato (termini moderni), unidico (accademico)

Analisi morfologica con gestione dei nomi propri

  • Ingresso: "東京都渋谷区"

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

Coreano

lindera

ko-dic

Analisi morfologica del coreano

  • Ingresso: "안녕하세요"

  • Output: ["안녕", "하", "세요"]

Lingue multilingue o sconosciute

Per contenuti in cui le lingue sono imprevedibili o miste all'interno dei documenti:

Tokenizzatore

Come funziona

Ideale per

Esempi

icu

Tokenizzazione consapevole di Unicode (International Components for Unicode)

Scritture miste, lingue sconosciute o quando la semplice tokenizzazione è sufficiente

  • Ingresso: "Hello 世界 مرحبا"

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

Quando usare icu:

  • Lingue miste in cui l'identificazione della lingua non è praticabile.

  • Non si vuole l'overhead degli analizzatori multilingue o dell'identificatore di lingua.

  • Il contenuto ha una lingua principale con parole straniere occasionali che contribuiscono poco al significato complessivo (ad esempio, testo inglese con sporadici nomi di marche o termini tecnici in giapponese o francese).

Approcci alternativi: Per una gestione più precisa dei contenuti multilingue, è possibile utilizzare gli analizzatori multilingue o l'identificatore di lingua. Per ulteriori informazioni, consultare Analizzatori multilingue o Identificatore di lingua.

Fase 2: Aggiungere filtri per la precisione

Dopo aver selezionato il tokenizer, applicare i filtri in base ai requisiti di ricerca specifici e alle caratteristiche dei contenuti.

Filtri comunemente utilizzati

Questi filtri sono essenziali per la maggior parte delle configurazioni di lingue separate dallo spazio (inglese, francese, tedesco, spagnolo, ecc.) e migliorano significativamente la qualità della ricerca:

Filtro

Come funziona

Quando usarlo

Esempi

lowercase

Converte tutti i token in minuscolo

Universale - si applica a tutte le lingue con distinzione di maiuscole e minuscole

  • Ingresso: ["Apple", "iPhone"]

  • Output: [['apple'], ['iphone']]

stemmer

Riduce le parole alla loro forma radicale

Lingue con inflessioni delle parole (inglese, francese, tedesco, ecc.)

Per l'inglese:

  • Ingresso: ["running", "runs", "ran"]

  • Output: [['run'], ['run'], ['ran']]

stop

Rimuove le parole comuni prive di significato

Per la maggior parte delle lingue - particolarmente efficace per le lingue con separazione spaziale

  • Ingresso: ["the", "quick", "brown", "fox"]

  • Uscita: Rimuovere le parole comuni prive di significato: [[], ['quick'], ['brown'], ['fox']]

Per le lingue dell'Asia orientale (cinese, giapponese, coreano, ecc.), concentrarsi invece su filtri specifici per la lingua. Queste lingue utilizzano in genere approcci diversi per l'elaborazione del testo e potrebbero non beneficiare in modo significativo della funzione di stemming.

Filtri di normalizzazione del testo

Questi filtri normalizzano le variazioni del testo per migliorare la coerenza della corrispondenza:

Filtro

Come funziona

Quando usarlo

Esempi

asciifolding

Convertire i caratteri accentati in equivalenti ASCII

Contenuti internazionali, contenuti generati dagli utenti

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

  • Output: [['cafe'], ['naive'], ['resume']]

Filtraggio dei token

Controlla quali token vengono conservati in base al contenuto o alla lunghezza dei caratteri:

Filtro

Come funziona

Quando usarlo

Esempi

removepunct

Rimuovere i token di punteggiatura indipendenti

Pulisce l'output dei tokenizer jieba, lindera, icu, che restituiscono le punteggiature come singoli token

  • Ingresso: ["Hello", "!", "world"]

  • Output: [['Hello'], ['world']]

alphanumonly

Mantenere solo lettere e numeri

Contenuto tecnico, elaborazione pulita del testo

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

  • Uscita: [['user123'], ['test', 'email', 'com']]

length

Rimuovere i token al di fuori dell'intervallo di lunghezza specificato

Filtrare il rumore (token eccessivamente lunghi)

  • Ingresso: ["a", "very", "extraordinarily"]

  • Uscita: [['a'], ['very'], []] (se max=10)

regex

Filtraggio personalizzato basato su modelli

Requisiti dei token specifici del dominio

  • Ingresso: ["test123", "prod456"]

  • Uscita: [[], ['prod456']] (se expr="^prod")

Filtri specifici per la lingua

Questi filtri gestiscono caratteristiche linguistiche specifiche:

Filtro

Lingua

Come funziona

Esempi

decompounder

Tedesco

Suddivide le parole composte in componenti ricercabili

  • Ingresso: ["dampfschifffahrt"]

  • Output: [['dampf', 'schiff', 'fahrt']]

cnalphanumonly

Cinese

Mantiene i caratteri cinesi + alfanumerici

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

  • Uscita: [['Hello'], ['世界'], ['123'], []]

cncharonly

Cinese

Conserva solo i caratteri cinesi

  • Ingresso: ["Hello", "世界", "123"]

  • Uscita: [[], ['世界'], []]

Passo 3: Combinare e implementare

Per creare l'analizzatore personalizzato, si definiscono il tokenizer e un elenco di filtri nel dizionario analyzer_params. I filtri vengono applicati nell'ordine in cui sono elencati.

# 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,
)

Finale: Testare con run_analyzer

Convalidare sempre la configurazione prima di applicarla a una raccolta:

# 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)

Problemi comuni da controllare:

  • Sovratitolazione: I termini tecnici vengono suddivisi in modo errato

  • Sotto-tipizzazione: Frasi non separate correttamente

  • Gettoni mancanti: I termini importanti vengono filtrati

Per un utilizzo dettagliato, consultare run_analyzer.

Questa sezione fornisce le configurazioni di tokenizer e filtri consigliate per i casi d'uso più comuni quando si lavora con gli analizzatori in Milvus. Scegliere la combinazione che meglio si adatta al tipo di contenuto e ai requisiti di ricerca.

Prima di applicare un analizzatore alla propria raccolta, si consiglia di usare run_analyzer per testare e convalidare le prestazioni dell'analisi del testo.

Lingue con segni di accento (francese, spagnolo, tedesco, ecc.)

Utilizzare un tokenizer standard con conversione in minuscolo, stemming specifico per la lingua e rimozione delle stopword. Questa configurazione funziona anche per altre lingue europee modificando i parametri language e stop_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

Contenuto inglese

Per l'elaborazione del testo inglese con un filtro completo. È possibile utilizzare anche l'analizzatore english analizzatore integrato:

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

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

Contenuto cinese

Utilizzare il tokenizer jieba e applicare un filtro per i caratteri per mantenere solo i caratteri cinesi, le lettere latine e le cifre.

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

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

Per il cinese semplificato, cnalphanumonly rimuove tutti i token tranne i caratteri cinesi, il testo alfanumerico e le cifre. In questo modo si evita che la punteggiatura influisca sulla qualità della ricerca.

Contenuto giapponese

Utilizzare il tokenizer lindera con il dizionario giapponese e i filtri per pulire la punteggiatura e controllare la lunghezza dei token:

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

Contenuti coreani

Simile al giapponese, utilizzando il tokenizer lindera con il dizionario coreano:

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

Contenuti misti o multilingue

Quando si lavora con contenuti che abbracciano più lingue o che utilizzano script in modo imprevedibile, si può iniziare con l'analizzatore icu. Questo analizzatore, consapevole di Unicode, gestisce efficacemente scritture e simboli misti.

Configurazione multilingue di base (senza stemming):

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

Elaborazione multilingue avanzata:

Per un migliore controllo del comportamento dei token in diverse lingue:

Integrazione con le funzioni di recupero del testo

Dopo aver selezionato l'analizzatore, è possibile integrarlo con le funzioni di recupero del testo fornite da Milvus.

  • Ricerca di testo completo

    Gli analizzatori hanno un impatto diretto sulla ricerca full text basata su BM25 attraverso la generazione di vettori sparsi. Utilizzare lo stesso analizzatore sia per l'indicizzazione che per l'interrogazione, per garantire una tokenizzazione coerente. Gli analizzatori specifici per la lingua forniscono generalmente un punteggio BM25 migliore rispetto a quelli generici. Per i dettagli sull'implementazione, consultare la sezione Ricerca di testo completo.

  • Corrispondenza di testo

    Le operazioni di corrispondenza del testo eseguono una corrispondenza esatta dei token tra le query e il contenuto indicizzato in base ai risultati dell'analizzatore. Per i dettagli sull'implementazione, fare riferimento a Corrispondenza di testo.

  • Corrispondenza di frase

    La corrispondenza di frase richiede una tokenizzazione coerente tra le espressioni di più parole per mantenere i confini e il significato della frase. Per i dettagli sull'implementazione, fare riferimento a Corrispondenza di frase.