【发布时间】:2017-03-23 17:10:40
【问题描述】:
使用 MS SQL 2016 全文搜索对表进行搜索,用户搜索“quick brown fox”。这不会返回任何结果,因为所有三个单词都不会出现在任何单个记录中。但是“quick brown”会返回结果,“brown fox”和“quick fox”也是如此。
有没有一种方法可以构造输入查询,使单词是可选的(即用户说“quick brown *fox”来表示 fox 是可选的)或查询本身返回没有所有单词的结果?我不介意运行两个查询,第一个查询所有单词,如果第一个查询没有返回任何行,则再次查询不完整的输入。
string query = String.Concat(@"
SELECT *
FROM FullTextSearches AS FT_TBL INNER JOIN
CONTAINSTABLE(FullTextSearches, (Title, Body), @SearchCondition) AS KEY_TBL
ON FT_TBL.Id = KEY_TBL.[KEY]
WHERE (FT_TBL.Accessibility = 0) OR ((FT_TBL.Accessibility & @Roles) > 0)
ORDER BY KEY_TBL.[RANK] DESC
OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY");
SqlParameter paramSearch = new SqlParameter("SearchCondition", "\"" + searchTerm + "\"");
SqlParameter paramSkip = new SqlParameter("Skip", pageNumber * pageSize);
SqlParameter paramTake = new SqlParameter("Take", pageSize);
SqlParameter paramRoles = new SqlParameter("Roles", accessibility);
object[] parameters = new object[] { paramSearch, paramSkip, paramTake, paramRoles };
var results = db.FullTextSearch.SqlQuery(query, parameters);
一直在学习。
【问题讨论】:
-
是否总是排除第三个单词?
-
可以是任何单词。理想情况下,它将返回所有单词的排名高于仅包含部分单词的记录的记录。例如,当未找到所有单词时,Google 会在其搜索结果中声明“缺失:[单词]”。我没有必须拥有它,只是一个 WIBNI。
标签: c# sql sql-server full-text-search