Elegir un idioma al crear un índice de texto completo

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Cuando crees un índice de texto completo, especifica un lenguaje a nivel de columna para la columna indexada. Las consultas de texto completo en la columna utilizan el separador de palabras y los stemmers del idioma especificado. Considera cómo el motor de Full-Text tokeniza y luego indexa tu texto cuando eliges el lenguaje de la columna.

Nota:

Para especificar un idioma de nivel de columna para una columna de índice de texto completo, use la LANGUAGE <language_term> cláusula al especificar la columna. Para obtener más información, vea CREATE FULLTEXT INDEX y ALTER FULLTEXT INDEX.

Esta sección proporciona una introducción a los separadores de palabras y lematizadores, y explica cómo usa la búsqueda de texto completo el LCID del idioma de columna.

Introducción a los separadores de palabras y lematizadores

El motor de base de datos de SQL Server incluye separadores de palabras y generadores de raíces para muchos idiomas, habilitados de forma predeterminada. Microsoft Natural Language Group (NLG) implementa y admite estos componentes lingüísticos. Para una lista de lenguas soportadas, véase sys.fulltext_languages.

Los componentes externos como los descifradores de palabras y filtros deben firmarse para mejorar la seguridad. Para verificar la firma, ejecuta la siguiente declaración:

EXECUTE sp_fulltext_service 'verify_signature';

Cómo Full-Text Search utiliza el nombre del idioma a nivel de columna

Cuando crees un índice de texto completo, especifica un nombre válido de idioma para cada columna. Si un nombre de idioma es válido, pero la vista de catálogo sys.fulltext_languages no lo devuelve, la búsqueda de texto completo recurre al nombre de idioma disponible más cercano de la misma familia lingüística, si existe. De lo contrario, Full-Text Search recurre al separador de palabras neutro. Para evitar este comportamiento por defecto, especifica un nombre de idioma válido y disponible.

Nota:

El LCID se usa con todos los tipos de datos aptos para la indexación de texto completo (como char o nchar). Aunque el criterio de ordenación de una columna de tipo char, varcharo text esté establecido en una configuración de idioma distinta del identificado por el LCID, el LCID se usa de todos modos durante la indexación de texto completo y en las consultas de esas columnas.

División de palabras

Un divisor de palabras tokeniza el texto que se va a indexar según los límites de las palabras, que son específicos de cada idioma. Por consiguiente, el comportamiento de separación de palabras difiere entre los diferentes idiomas. Si usa un idioma, x, para indexar varios idiomas {x, yy z}, parte del comportamiento podría provocar resultados inesperados. Por ejemplo, un guión (-) o una coma (,) pueden ser elementos de separación de palabras que se descartan en un idioma pero no en otro. En raras ocasiones, puede producirse un comportamiento inesperado en la generación de raíces, ya que una palabra determinada puede derivarse de forma diferente en distintos idiomas. Por ejemplo, en inglés estos límites de palabras suelen ser espacios en blanco o alguna forma de puntuación. En otros idiomas, como el alemán, las palabras o caracteres pueden combinarse. Por lo tanto, el idioma de nivel de columna que elija debe representar el idioma que espera almacenar en filas de esa columna.

Idiomas occidentales

Para la familia occidental de idiomas, si no está seguro de qué idiomas se van a almacenar en una columna, o espera que se almacene más de uno, una solución alternativa general es usar el separador de palabras para el idioma más complejo que podría almacenarse en la columna.

Por ejemplo, es posible que espere almacenar contenido inglés, español y alemán en una sola columna. Estos tres idiomas occidentales poseen patrones similares de separación de palabras, y los patrones alemanes son los más complejos. Por lo tanto, en este caso, una buena opción es usar el desglosador de palabras alemán, que puede procesar correctamente textos en inglés y español. Por el contrario, el separador de palabras inglés no podría procesar perfectamente el texto alemán debido a sus palabras compuestas.

El uso del separador de palabras del lenguaje más complejo de una familia de idiomas no garantiza la indexación perfecta de todos los idiomas de la familia. Puede haber casos límite en los que ni siquiera el divisor de palabras más complejo pueda procesar correctamente texto escrito en otro idioma.

Lenguas no occidentales

Para lenguas no occidentales (como chino, japonés, hindi, etc.), la solución anterior no necesariamente funciona, por razones lingüísticas. Para lenguas no occidentales, considera una de las siguientes soluciones alternativas:

  • Para idiomas de familias diferentes

    Si una columna puede contener idiomas drásticamente diferentes, por ejemplo, español y japonés, considere almacenar el contenido de los distintos idiomas en columnas independientes. Esta separación te permite usar el divisor de palabras específico del idioma para cada columna. Si elige esta solución y no conoce el idioma de las consultas en el momento de la consulta, puede que tenga que emitir la consulta en ambas columnas para asegurarse de que encuentra la fila o documento correctos.

  • Para contenido binario (como documentos de Microsoft Word)

    Cuando el contenido indexado es de tipo binario , el filtro de búsqueda Full-Text que procesa el texto antes de enviarlo al desglosante puede respetar etiquetas específicas de idioma dentro del archivo binario. En este caso, en el momento de la indexación, el filtro emite el LCID adecuado para un documento o sección de un documento. A continuación, el motor de texto completo llamará al separador de palabras del idioma con ese LCID. Sin embargo, tras indexar contenido multilingüe, verifica que el contenido esté correctamente indexado.

  • Para contenido de texto simple

    Cuando el contenido sea texto simple, puede convertirlo al tipo de datos xml y agregar etiquetas de idioma que indiquen el idioma que corresponde a cada documento concreto o sección del documento. Para que esto funcione, sin embargo, tiene que conocer el idioma antes de la indización de texto completo.

Raíz

Una consideración adicional al elegir el idioma de columna es la lematización. En las consultas de texto completo, lalematización es un proceso de búsqueda de todas las formas con inflexión de una palabra en un idioma determinado. Al utilizar un separador de palabras genérico para procesar varios idiomas, el proceso de lematización solo funciona para el idioma especificado de la columna, no para otros idiomas de la misma. Por ejemplo, los lematizadores de alemán no funcionan para inglés o español (etc.). Este comportamiento puede afectar a tu recuerdo dependiendo del idioma que elijas al momento de la consulta.

Otra consideración en la elección del idioma se refiere al modo en que se representan los datos. Para los datos que no se almacenan en una columna varbinary(max), no se realiza ningún filtrado especial. sino que el texto suele pasarse por el componente separador de palabras tal y como es.

Además, los separadores de palabras se han diseñado principalmente para procesar el texto escrito. Si tu texto contiene marcado (como HTML), la precisión lingüística durante la indexación y la búsqueda podría reducirse. En ese caso, tienes dos opciones: el método preferido es almacenar los datos de texto en una columna varbinary(max ) e indicar su tipo de documento para que pueda filtrarse. Si ese enfoque no es una opción, plantéate utilizar el separador de palabras neutro y, si es posible, añadir datos de marcado (como br en HTML) a tus listas de palabras irrelevantes.

Nota:

El stemming basado en el lenguaje no se aplica cuando especificas el lenguaje neutral.

Especificar un lenguaje a nivel de columna no predeterminado en una consulta de texto completo

Por defecto, en el Motor de base de datos, Full-Text Search analiza los términos de consulta usando el lenguaje especificado para cada columna de la cláusula de texto completo. Para invalidar este comportamiento, especifique un idioma no predeterminado en el momento de la consulta. Para los idiomas admitidos cuyos recursos estén instalados, se puede usar la cláusula LANGUAGE <language_term> de una consulta CONTAINS, CONTAINSTABLE, FREETEXT o FREETEXTTABLE para especificar el idioma que se usa para la separación de palabras, la lematización, el diccionario de sinónimos y el procesamiento de las palabras irrelevantes de los términos de las consultas.