一尘不染

将全文搜索与SQL Server结合起来有多难?

sql

我正在构建一个带有SQL后端的C#/
ASP.NET应用程序。我正按时完成工作,并完成了我的页面,在我的其中一个页面上,我的一位设计师在左侧区域加入了全文搜索。到目前为止,我的“搜索”一直是过滤器,能够通过某些因素和列值来缩小结果集的范围。

由于我正按时完成任务(您知道一个晚上要睡3个小时,那时候我看上去就像猫吃了东西就扔了一样),所以我希望此页面与其他页面非常相似,因此我正在尝试决定是否发臭。我以前从未在页面上进行过全文搜索....这是要爬的山还是有简单的解决方案?

谢谢你。


阅读 182

收藏
2021-03-17

共1个答案

一尘不染

首先,您需要在生产服务器上启用“全文本搜索”索引,因此,如果这不在范围之内,那么您就不希望这样做。

但是,如果已经准备好了,则全文搜索相对简单。

T-SQL有4个用于全文搜索的谓词:

  • 自由文本
  • 自由文本表
  • 内含物
  • 可容纳

FREETEXT是最简单的,可以这样完成:

SELECT UserName
FROM Tbl_Users
WHERE FREETEXT (UserName, 'bob' )

Results:

JimBob
Little Bobby Tables

FREETEXTTABLE的功能与FreeTEXT相同,不同之处在于它以表形式返回结果。

T-SQL全文搜索的真正功能来自CONTAINS(和CONTAINSTABLE)谓词…这是一个很大的谓词,因此我将其用法粘贴到:

CONTAINS
    ( { column | * } , '< contains_search_condition >' 
    )

< contains_search_condition > ::= 
        { < simple_term > 
        | < prefix_term > 
        | < generation_term > 
        | < proximity_term > 
        | < weighted_term > 
        } 
        | { ( < contains_search_condition > ) 
        { AND | AND NOT | OR } < contains_search_condition > [ ...n ] 
        }

< simple_term > ::= 
    word | " phrase "

< prefix term > ::= 
    { "word * " | "phrase * " }

< generation_term > ::= 
    FORMSOF ( INFLECTIONAL , < simple_term > [ ,...n ] )

< proximity_term > ::= 
    { < simple_term > | < prefix_term > } 
    { { NEAR | ~ } { < simple_term > | < prefix_term > } } [ ...n ]

< weighted_term > ::= 
    ISABOUT 
        ( { { 
                < simple_term > 
                | < prefix_term > 
                | < generation_term > 
                | < proximity_term > 
                } 
            [ WEIGHT ( weight_value ) ] 
            } [ ,...n ] 
        )

这意味着您可以编写查询,例如:

SELECT UserName
FROM Tbl_Users
WHERE CONTAINS(UserName, '"little*" NEAR tables')

Results:

Little Bobby Tables

祝你好运 :)

2021-03-17