SQL Server全文本搜索包含未按预期工作

时间:2019-01-04 08:18:51

标签: sql-server azure-sql-database

我已经在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 *
…
…

我不明白为什么它不起作用。谁能帮我解决这个问题?

1 个答案:

答案 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;

我完全理解这不是一个完整的解决方案,甚至不是一个令人满意的答案,但至少它可以使您前进。