es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

FREETEXTTABLE siempre devuelve los mismos rangos para todos los registros.

La siguiente consulta siempre devuelve el mismo RANK para todos los registros. He intentado no usar comillas y el resultado es el mismo. También he intentado eliminar y crear un nuevo índice sin éxito.

select * from FREETEXTTABLE(tProductCharItem, pci_name, '"Размер"') t
            join tProductCharItem pci on t.[KEY] = pci.pci_id
            order by [rank] desc
KEY RANK pci_name
53 80 Размер
89 80 Размер люльки (ШxД), см
90 80 Размер прогулочного блока (ШxД), см
91 80 Размер спального места, см
154 80 Размер матраса
209 80 Размер пеленального столика (ШхД), см

Datos de ejemplo:

create table tProductCharItem(pci_id int identity(1,1) primary key, pci_name nvarchar(100))
insert into tProductCharItem(pci_name) select 'Размер'
insert into tProductCharItem(pci_name) select 'Размер люльки (ШxД), см'
insert into tProductCharItem(pci_name) select 'Размер прогулочного блока (ШxД), см'
insert into tProductCharItem(pci_name) select 'Размер спального места, см'
insert into tProductCharItem(pci_name) select 'Размер матраса'
insert into tProductCharItem(pci_name) select 'Размер пеленального столика (ШхД), см'
insert into tProductCharItem(pci_name) select 'Размер спального места подростковой кровати'
insert into tProductCharItem(pci_name) select 'Размер подножки, см'
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con la consulta es que está utilizando la función FREETEXTTABLE, la cual realiza una búsqueda de “lenguaje natural” y genera una clasificación basada en la relevancia del término de búsqueda respecto al contenido indexado. En este caso, el término de búsqueda “”Размер”” no es un término de lenguaje natural, sino una coincidencia exacta. Por lo tanto, la función FREETEXTTABLE devuelve la misma clasificación para todos los registros, ya que todos contienen el término de búsqueda exacto.

    Para solucionar el problema, la consulta debe utilizar la función CONTAINSTABLE en lugar de FREETEXTTABLE. CONTAINSTABLE admite búsquedas de coincidencia exacta y devolverá las clasificaciones correctas para cada registro. La consulta actualizada se vería así:

    SELECT *
    FROM CONTAINSTABLE(tProductCharItem, pci_name, N'"Размер"') t
    JOIN tProductCharItem pci ON t.[KEY] = pci.pci_id
    ORDER BY t.[rank] DESC
    

    Ten en cuenta que el término de búsqueda está encerrado entre comillas y se le antepone la letra “N” para indicar que es una cadena Unicode. Además, el alias de la columna [rank] ha sido reemplazado por t.[rank] ya que es el alias utilizado en la tabla generada por CONTAINSTABLE.

Comments are closed.