Utiliza analizadores específicos del lenguaje para crear índices adaptados a un lenguaje particular. Cada analizador de idioma tiene funcionalidad incorporada de palabras vacías y divisiones de palabras basadas en los patrones de uso de ese idioma.
MongoDB Search ofrece los siguientes analizadores de lenguaje:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 cjk es un analizador genérico chino, japonés y coreano
2 kuromoji es un analizador japonés
3 morfologik es un analizador polaco
4 nori es un analizador coreano
5 smartcn es un analizador chino
Ejemplos
Considere una colección llamada cars con los siguientes documentos:
{ "_id": 1, "subject": { "en": "It is better to equip our cars to understand the causes of the accident.", "fr": "Mieux équiper nos voitures pour comprendre les causes d'un accident.", "he": "עדיף לצייד את המכוניות שלנו כדי להבין את הגורמים לתאונה." } }
{ "_id": 2, "subject": { "en": "The best time to do this is immediately after you've filled up with fuel", "fr": "Le meilleur moment pour le faire c'est immédiatement après que vous aurez fait le plein de carburant.", "he": "הזמן הטוב ביותר לעשות זאת הוא מיד לאחר שמילאת דלק." } }
Ejemplo de analizador de lenguaje con funcionalidad incorporada
La siguiente definición de índice de ejemplo especifica un índice en el campo subject.fr utilizando el analizador french:
{ "mappings": { "fields": { "subject": { "fields": { "fr": { "analyzer": "lucene.french", "type": "string" } }, "type": "document" } } } }
El siguiente query de MongoDB Search busca la string pour en el campo subject.fr. Para ejecutar esta consulta, conéctate a tu clúster utilizando mongosh y cambia a la base de datos que contiene la colección cars.
db.cars.aggregate([ { $search: { "text": { "query": "pour", "path": "subject.fr" } } }, { $project: { "_id": 0, "subject.fr": 1 } } ])
La consulta anterior no devuelve ningún resultado al utilizar el analizador french, porque pour es una palabra vacía incorporada. Usando el analizador standard, la misma query devolvería ambos documentos.
El siguiente query de MongoDB Search busca la string carburant en el campo subject.fr. Para ejecutar esta consulta, conéctate a tu clúster utilizando mongosh y cambia a la base de datos que contiene la colección cars.
db.cars.aggregate([ { $search: { "text": { "query": "carburant", "path": "subject.fr" } } }, { $project: { "_id": 0, "subject.fr": 1 } } ])
MongoDB Search devuelve un documento con _id: 1 en los resultados porque la query coincidió con un token que el analizador lucene.french creó para el documento. El analizador lucene.french crea los siguientes tokens para el campo subject.fr en el documento con _id: 1:
|
|
|
|
|
|
|
|
|
Ejemplo de analizador de lenguaje personalizado
También puedes crear índices para idiomas no compatibles creando un analizador personalizado con los filtros de tokens icuFolding y stopword.
El siguiente ejemplo de definición de índice especifica un índice en el campo subject.he mediante un analizador personalizado llamado myHebrewAnalyzer para analizar y crear tokens para texto en hebreo:
{ "analyzer": "lucene.standard", "mappings": { "dynamic": false, "fields": { "subject": { "fields": { "he": { "analyzer": "myHebrewAnalyzer", "type": "string" } }, "type": "document" } } }, "analyzers": [ { "charFilters": [], "name": "myHebrewAnalyzer", "tokenFilters": [ { "type": "icuFolding" }, { "tokens": [ "אן", "שלנו", "זה", "אל" ], "type": "stopword" } ], "tokenizer": { "type": "standard" } } ] }
El siguiente query de MongoDB Search busca la string המכוניות en el campo subject.he. Para ejecutar esta consulta, conéctate a tu clúster utilizando mongosh y cambia a la base de datos que contiene la colección cars.
db.cars.aggregate([ { $search: { "text": { "query": "המכוניות", "path": "subject.he" } } }, { $project: { "_id": 0, "subject.he": 1 } } ])
MongoDB Search devuelve un documento con _id: 1 en los resultados porque la query coincidió con un token que el analizador myHebrewAnalyzer creó para el documento. El analizador myHebrewAnalyzer crea los siguientes tokens para el campo subject.he en el documento con _id: 1:
|
|
|
|
|
|
|
|
|
Ejemplo de búsqueda multilingüe
También puedes crear un índice que utilice múltiples analizadores de idioma para realizar una búsqueda multilingüe.
La siguiente definición de índice de ejemplo especifica un índice con mapeo dinámico en la colección sample_mflix.movies. La definición aplica el analizador de lenguaje lucene.italian para indexar el campo fullplot, y usa la opción multi para especificar lucene.english como un analizador de lenguaje alternativo. MongoDB Search utiliza el analizador de lenguaje por defecto lucene.english para todos los demás campos que indexa dinámicamente en la colección movies.
{ "analyzer": "lucene.standard", "mappings": { "dynamic": true, "fields": { "fullplot": { "type": "string", "analyzer": "lucene.italian", "multi": { "fullplot_english": { "type": "string", "analyzer": "lucene.english", } } } } } }
El siguiente query de MongoDB Search utiliza el operador compuesto para consultar la colección en varios idiomas. Para ejecutar este query, conéctate a tu clúster usando mongosh y cambia a la base de datos sample_mflix.
El operador compuesto contiene las siguientes cláusulas:
mustla cláusula busca argumentos de películas en inglés e italiano que contengan el términoBellautilizando el operador de textomustNotla cláusula excluye películas lanzadas entre los años 1984 y 2016 utilizando el operador de rangoshouldcláusula especifica la preferencia por el género deComedyutilizando el operador de texto
db.movies.aggregate([ { $search: { "index": "multilingual-tutorial", "compound": { "must": [{ "text": { "query": "Bella", "path": { "value": "fullplot", "multi": "fullplot_english" } } }], "mustNot": [{ "range": { "path": "released", "gt": ISODate("1984-01-01T00:00:00.000Z"), "lt": ISODate("2016-01-01T00:00:00.000Z") } }], "should": [{ "text": { "query": "Comedy", "path": "genres" } }] } } }, { $project: { "_id": 0, "title": 1, "plot": 1, "genres": 1, "runtime": 1, "fullplot": 1, "released": 1, "score": { "$meta": "searchScore" } } } ])