Полнотекстовый поиск SQL Server не работает должным образом - PullRequest
0 голосов
/ 04 января 2019

Я создал таблицу в Azure SQL Server с полнотекстовым индексом. Я использовал этот код для создания полнотекстового индекса:

use [MyDb]

create fulltext catalog full_text_catalog_foods;
go

create fulltext index 
on dbo.foods(food_name,[description])
key index PK_Foods_foodId on full_text_catalog_foods;

В моем столе одна еда, т.е. "Чай с молоком и сахаром". Поэтому я пытаюсь найти этот результат по запросу ниже. но он возвращает пустой набор результатов.

declare @filters nvarchar(250) = 'r',
        @q nvarchar(150) = 'tea with milk';

set @q = '"'+@q+'*"';

select 
    f.[Id]
    ,f.[food_name]
    ,f.[info_id]
    ...
    ...
    --few more column
from 
    dbo.Foods f
where 
    contains(f.food_name, @q) and f.model = @filters;

Я пробовал вышеуказанный запрос, а также мой исходный запрос, как показано ниже. Но оба запроса возвращают пустой результат.

declare @Offset int = 0,
    @Limit int = 50,
    @filters nvarchar(250) = 'r',
    @q nvarchar(150) = 'tea with milk';

set @q = '"'+@q+'*"';
select 
    f.[Id]
    ,f.[food_name]
    ,f.[info_id]
    ...
    ...
    --few more column
from dbo.Foods f
where contains(f.food_name,@q) and f.model = @filters
order by f.Id
offset @Offset rows
fetch next @Limit rows only;

Редактировать

У меня есть три записи в таблице продуктов с food_name = "Чай с молоком и сахаром", и это model = r. Когда я использую приведенный ниже код, он возвращает две записи с именем «Чай с молоком и сахаром».

declare @q nvarchar(150) = 'tea with milk and sugar';
set @q = '"'+@q+'"'; -- here removed *
…
…

Я не понимаю, почему это не работает. Может кто-нибудь помочь мне решить эту проблему?

1 Ответ

0 голосов
/ 04 января 2019

Я не могу дать вам серьезную причину, но я вполне уверен, что это вызвано путаницей в словах шума.Оба слова «с» и «и» будут обрабатываться как шумовые слова (не индексируются), но при использовании звездочки (префиксный термин) внезапно «с» не обрабатывается как шумовое слово.

My догадываюсь , что это происходит:

indexed text:
    Tea (noise) Milk (noise) Sugar

search for "tea with milk":
    tea (noise) milk <- this should generate hits

search for "tea with milk*":
    tea* with* milk* <- "with" is no longer noise. No hits.

Вы можете проверить это, просто удалив звездочку, и это должно затем вернуть ожидаемый результат.

Другой вариант - отключить шумовые слова.

ALTER FULLTEXT INDEX ON table
  SET STOPLIST OFF;

Возможно, вы захотите перестроить индекс:

ALTER FULLTEXT CATALOG REBUILD;

Я полностью понимаю, что это не полныйрешение или даже действительно удовлетворительный ответ, но, по крайней мере, это может продвинуть вас вперед.

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