我已经在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;
编辑
我在食物表中有3条记录,其中food_name
=“加牛奶和糖的茶”,它是model = r
。当我使用下面的代码时,它将返回两个名称为“茶加牛奶和糖”的记录。
declare @q nvarchar(150) = 'tea with milk and sugar';
set @q = '"'+@q+'"'; -- here removed *
…
…
我不明白为什么它不起作用。谁能帮我解决这个问题?
答案 0 :(得分:3)
我无法提供深入的原因,但是我敢肯定,这是由干扰词引起的。 “ with”和“ and”这两个词都将被视作干扰词(未索引),但是当使用星号(前缀术语)时,突然将“ with”视作干扰词。
我的猜测就是这种情况:
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;
我完全理解这不是一个完整的解决方案,甚至不是一个令人满意的答案,但至少它可以使您前进。