Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
全文搜索精确匹配检查SQL Server_Sql_Sql Server_Full Text Search - Fatal编程技术网

全文搜索精确匹配检查SQL Server

全文搜索精确匹配检查SQL Server,sql,sql-server,full-text-search,Sql,Sql Server,Full Text Search,我在视图上进行了全文搜索,该视图返回所有已批准的业务和有关所述业务的元数据 我使用以下代码实现了一个存储过程来利用全文搜索: CREATE PROCEDURE [dbo].[Search] @SearchTerm varchar(8000), @CurrentPage int = 1, @PageSize int = 100 AS BEGIN DECLARE @NearPredicate varchar(8000), @AndPredicate varcha

我在视图上进行了全文搜索,该视图返回所有已批准的业务和有关所述业务的元数据

我使用以下代码实现了一个存储过程来利用全文搜索:

CREATE PROCEDURE [dbo].[Search]
@SearchTerm varchar(8000),
@CurrentPage int = 1, 
@PageSize int = 100

AS
BEGIN
    DECLARE @NearPredicate varchar(8000), 
            @AndPredicate varchar(8000), 
            @TotalRecords int

SELECT 
    @NearPredicate = COALESCE(@NearPredicate + ' NEAR ', '') + Data
FROM Split(@SearchTerm, ' ') 
    LEFT JOIN sys.fulltext_system_stopwords ON Data = stopword
WHERE stopword IS NULL

SET @AndPredicate = REPLACE(@NearPredicate, 'NEAR', 'AND')
SET @NearPredicate = '(' + @NearPredicate + ')'

SET @TotalRecords  = (
    SELECT 
        COUNT(*) 
    FROM 
        vwApprovedBusiness 
    WHERE FREETEXT(*, @AndPredicate ) 
    )

SELECT *,
    ct.Rank,
    @TotalRecords AS TotalRecords
FROM 
    vwApprovedBusiness a
        INNER JOIN FREETEXTTABLE (vwApprovedBusiness, *, @NearPredicate ) AS ct ON a.MyBusinessID = ct.[KEY]
ORDER BY 
    ct.RANK DESC
OFFSET (@CurrentPage - 1) * @PageSize ROWS FETCH NEXT @PageSize ROWS only

END

如果我搜索一个企业名称,例如一人交通,这是一个经批准的企业,它只会出现在我的搜索结果中,大约在第6或第7位,而不是预期的第一个结果。任何与此相关的帮助都将不胜感激

我建议将全文搜索调用从FREETEXT/FREETEXTTABLE转换为CONTAINS/CONTAINSTABLE,因为我认为在搜索say business name时,FREETEXT是不合适的,因为这是确切的短语。根据MSDN文件:

CONTAINS和FREETEXT对于不同类型的匹配很有用,如下所示:

  • 使用CONTAINS(或CONTAINSTABLE)对单个单词和短语进行精确的或模糊的(不太精确的)匹配,单词之间在一定距离内的接近度,或加权匹配

  • 使用FREETEXT(或FREETEXTTABLE)匹配指定单词、短语或句子(FREETEXT字符串)的含义,而不是确切的措辞。如果在指定列的全文索引中找到任何术语或任何术语的形式,则会生成匹配项

因此,在搜索企业名称时,您肯定希望精确匹配,因此必须使用CONTAINS

如果在业务元数据内部搜索时CONTAINS/CONTAINSTABLE产生的结果很少,则可以在UI中拆分搜索类型,并在按名称搜索时使用CONTAINS,在按业务描述/元数据搜索时使用FREETEXT。我个人认为包含在这两种情况下都可以

另一个注意事项是,在您的查询中,您有一个单独的FTS调用来获取@TotalRecords计数,但您可以将其嵌入到主搜索调用中:

SELECT *,
    ct.Rank,
    -- @TotalRecords AS TotalRecords
    COUNT(*) over () as TotalRecords
FROM 
    vwApprovedBusiness a
        INNER JOIN FREETEXTTABLE (vwApprovedBusiness, *, @NearPredicate ) AS ct ON a.MyBusinessID = ct.[KEY]
这就是答案吗?见flups答案