【发布时间】:2009-07-06 14:20:17
【问题描述】:
我有 3 个链接在一起的表。餐厅、美食和美食类型。 一家餐厅可以出售多种美食(这是不好的措辞,但你明白吗?)
所以我在 Restaurant:Name、CityTown、Postcode 和 CuisineType:Name 上设置了全文
我的主页上有一个搜索框,当用户键入时,结果会被过滤为最佳匹配。
这里有几个例子: SearchText = "皇家版" 现在餐厅里有一排叫皇家王朝的地方,小镇就是爱丁堡。 但我返回的最佳结果是某个城镇以 D 和名称开头的地方。这不是最好的匹配。
我将向您展示我的存储过程、原型,因此派生的名称有点骇人听闻。
ALTER PROCEDURE [dbo].[RestaurantsFullText]
@searchText nvarchar(255)
AS
SELECT
b.*,
COALESCE(akt2.[Rank],0) / 30 +
COALESCE(akt1.[Rank],0) / 30 +
COALESCE(akt.[Rank],0) / 30 +
COALESCE(bkt.[Rank],0) as rankCount
FROM
Restaurants b
left JOIN Cuisines c on b.Id = c.RestaurantId
left join CuisineType a
ON c.CuisineId = a.id
left JOIN
containstable(Restaurants, Name, @searchText) bkt
ON b.id = bkt.[Key]
left JOIN containstable(CuisineType, Name, @searchText) akt
ON a.id = akt.[Key]
left JOIN containstable(Restaurants, Postcode, @searchText) akt1
ON b.id = akt1.[Key]
left JOIN containstable(Restaurants, citytown, @searchText) akt2
ON b.id = akt2.[Key]
where
COALESCE(akt2.[Rank],0) / 30 +
COALESCE(akt1.[Rank],0) /30 +
COALESCE(akt.[Rank],0) / 30 +
COALESCE(bkt.[Rank],0) > 5
ORDER BY
COALESCE(akt2.[Rank],0) / 30 +
COALESCE(akt1.[Rank],0) / 30 +
COALESCE(akt.[Rank],0) / 30 +
COALESCE(bkt.[Rank],0) asc
我认为问题在于连接和排名的计算方式。
我想要这样,如果我通过“皇家王朝爱丁堡 d”,那么皇家王朝仍然是最好的比赛。
由于它是一个过滤器,因此不应返回以 d 开头的其他城市的城镇匹配。
我会非常感激这方面的帮助。
【问题讨论】:
标签: .net sql sql-server full-text-search