Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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 2005 搜索SQL Server_Sql Server 2005_Search_Full Text Search - Fatal编程技术网

Sql server 2005 搜索SQL Server

Sql server 2005 搜索SQL Server,sql-server-2005,search,full-text-search,Sql Server 2005,Search,Full Text Search,我被要求对我们的一个数据库进行搜索 标准是用户在搜索框中键入内容,然后SQL需要分割搜索中的所有单词,并在多个字段中搜索每个单词(可能是2个或3个),然后需要对结果进行加权。例如,所有单词出现的结果将是最上面的结果,如果只有1个单词出现,则加权值将更低 例如,如果您搜索“这是一篇演示文章” 结果的排名如下所示 Rank Field1 Field2 1: "This is a demo post" "" 2: "demo post"

我被要求对我们的一个数据库进行搜索

标准是用户在搜索框中键入内容,然后SQL需要分割搜索中的所有单词,并在多个字段中搜索每个单词(可能是2个或3个),然后需要对结果进行加权。例如,所有单词出现的结果将是最上面的结果,如果只有1个单词出现,则加权值将更低

例如,如果您搜索“这是一篇演示文章”

结果的排名如下所示

Rank   Field1                 Field2
1:     "This is a demo post"  ""
2:     "demo post"            ""
3:     "demo"                 "post"
4:     "post"                 ""
SELECT
    Msgs.RecordId,
    Msgs.Title,
    Msgs.Body
FROM
    [Messages] AS Msgs
    INNER JOIN FREETEXTTABLE([Messages],Title,@SearchText) AS TitleRanks ON Msgs.RecordId = TitleRanks.[Key]        
ORDER BY
    TitleRanks.[Key] DESC
希望这有点道理,这是一种类似谷歌的基础搜索

无论如何,我能想到这样做是非常混乱的


任何建议都很好

从逻辑上讲,你可以很容易地做到这一点,尽管这可能很难优化——特别是如果有人使用了一个特别长的短语

这是一个基本的例子,基于一张我必须拿出来的表格

SELECT TOP 100 Score, Forename FROM
(
    SELECT
        CASE
            WHEN Forename LIKE '%Kerry James%' THEN 100
            WHEN Forename LIKE '%Kerry%' AND Forename LIKE '%James%' THEN 75
            WHEN Forename LIKE '%Kerry%' THEN 50
            WHEN Forename LIKE '%James%' THEN 50
        END AS Score,
        Forename
    FROM
        tblPerson
) [Query]
WHERE
    Score > 0
ORDER BY
    Score DESC
在这个例子中,我是说一个精确匹配值为100,两个词(但不是一起)的匹配值为75,一个单词的匹配值为50。你可以根据自己的意愿将其复杂化,甚至包括SOUNDEX匹配,但这是一个简单的例子,可以为你指明正确的方向。

“谷歌式搜索”的意思是:全文搜索。看看

使用SQL Server 2008,它完全集成到SQL Server引擎中

在此之前,它是一个有点古怪的附加组件。升级到SQL Server 2008的另一个好理由!(而且SP1也已经发布了!)


Marc

我在表格上创建了一个全文索引,并将我的搜索结果连接到FREETEXTTABLE,这样我就可以看到每个结果的排名值

SQL最终看起来像这样

Rank   Field1                 Field2
1:     "This is a demo post"  ""
2:     "demo post"            ""
3:     "demo"                 "post"
4:     "post"                 ""
SELECT
    Msgs.RecordId,
    Msgs.Title,
    Msgs.Body
FROM
    [Messages] AS Msgs
    INNER JOIN FREETEXTTABLE([Messages],Title,@SearchText) AS TitleRanks ON Msgs.RecordId = TitleRanks.[Key]        
ORDER BY
    TitleRanks.[Key] DESC

过去我使用过全文索引,但从来没有意识到你可以使用这样的FultExtCabl,它对代码的易用性和它的工作效率印象深刻。

你可能想考虑TyeleRangks.排序,这是隐含列(范围从0到100)。指示每行与搜索条件的匹配程度。抱歉应该是TitleRanks.Rank DESC(100最相关,0最不相关)