代码之家  ›  专栏  ›  技术社区  ›  Stewart Robinson

如何使用containstable,并限制它正在搜索的表中的数据?

  •  2
  • Stewart Robinson  · 技术社区  · 14 年前

    我有一个包含我的广告的表格,可以在sql-server-2008中搜索。请参阅下面的代码。广告搜索表中的is_searchable基本上是该广告是否应包含在搜索中的标志。

    以下三个例子在我心目中产生了不合理的结果:

    第二个示例显示了where子句过滤掉不真实的可搜索记录的结果。由于在查询的from部分的containstable中未返回none,因此在应用where子句时未返回none。

    第三个例子只是将排名靠前的排名从1000改为4000。

    因此,我的问题是,如何使用“is_searchable=1”子句获得前1000个或n个结果?

    use live;
    
    declare @search_text as varchar(2000) = '"*interlet*"'
    
    
    --- TOP 1000 without clause (returns 1000 rows (all with is_searchable = 0)
    select is_searchable, *
    from CONTAINSTABLE (ad_search, searchText, @search_text, 1000) AS KEY_TBL
    inner join ad_search (nolock) ON ad_search.ad_search_id = KEY_TBL.[KEY]
    inner join ad_search_view_data on ad_search_view_data.ad_search_id = ad_search.ad_search_id
    
    
    --- TOP 1000 with "where ad_search.is_searchable = 1" clause returns 0 rows
    select is_searchable, *
    from CONTAINSTABLE (ad_search, searchText, @search_text, 1000) AS KEY_TBL
    inner join ad_search (nolock) ON ad_search.ad_search_id = KEY_TBL.[KEY]
    inner join ad_search_view_data on ad_search_view_data.ad_search_id = ad_search.ad_search_id
    where ad_search.is_searchable = 1
    
    -- TOP 4000 
    select is_searchable, *
    from CONTAINSTABLE (ad_search, searchText, @search_text, 4000) AS KEY_TBL
    inner join ad_search (nolock) ON ad_search.ad_search_id = KEY_TBL.[KEY]
    inner join ad_search_view_data on ad_search_view_data.ad_search_id = ad_search.ad_search_id
    where ad_search.is_searchable = 1 
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   KM.    14 年前

    试试这个:

    DECLARE @N int
    SET @N=325
    
    SELECT TOP(@N)
        is_searchable, *
        from CONTAINSTABLE (ad_search, searchText, @search_text) AS KEY_TBL
        inner join ad_search (nolock) ON ad_search.ad_search_id = KEY_TBL.[KEY]
        inner join ad_search_view_data on ad_search_view_data.ad_search_id = ad_search.ad_search_id
        where ad_search.is_searchable = 1
        ORDER BY KEY_TBL.Rank DESC
    

    @N可以是1000或任何你想要的值