MS SQL FTI - поиск по "n *" возвращает числа - PullRequest
1 голос
/ 05 сентября 2008

Это выглядит как странное поведение из полнотекстового индекса SQL.

FTI сохраняет номер в своем индексе с префиксом «NN», поэтому «123» сохраняется как «NN123».

Теперь, когда пользователь ищет слова, начинающиеся с N (то есть содержит «n *»), они также получают все числа.

Итак:

select [TextField]
from [MyTable] 
where contains([TextField], '"n*"') 

Возвращает:

MyTable.TextField
--------------------------------------------------
This text contains the word navigator
This text is nice
This text only has 123, and shouldn't be returned

Есть ли хороший способ исключить этот последний ряд? Есть ли последовательный обходной путь для этого?


Эти дополнительные "" необходимы для работы токена подстановочного знака:

select [TextField] from [MyTable] where contains([TextField], 'n*')

будет искать буквальное n * - а их нет.

--return rows with the word text
select [TextField] from [MyTable] where contains([TextField], 'text')

--return rows with the word tex*
select [TextField] from [MyTable] where contains([TextField], 'tex*')

--return rows with words that begin tex...
select [TextField] from [MyTable] where contains([TextField], '"tex*"')

1 Ответ

1 голос
/ 12 сентября 2008

Есть несколько способов справиться с этим, хотя ни один из них не так уж и хорош.

Сначала добавьте в таблицу столбец, в котором говорится, что TextField действительно число. Если бы вы могли сделать это и отфильтровать, у вас была бы самая производительная версия.

Если это не вариант, вам нужно будет добавить дополнительный фильтр. Хотя я не тестировал его подробно, вы можете добавить фильтр AND TextField NOT LIKE 'NN%[0-9]%'

Недостатком является то, что это отфильтровывает 'NN12NOO', но это может быть крайний случай, не представленный вашими данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...