首頁 資料庫 mysql教程 sql全文检索(full-text)用法与注意事项

sql全文检索(full-text)用法与注意事项

Jun 07, 2016 pm 05:49 PM
全文檢索

本文章来总结了SQL Server全文检索(full-text)用法与注意事项,有需要学习与了解sqlserver全文搜索的朋友可参考本文章。

SQL Server全文搜索 一项强大而又让人无可奈何的技术!说他强大,是因为他的检索速度极快,比like快几十上百倍。说他让人无可奈何,是因为很多场合对准确性要求很高,使用者又不能自己很好的组织查询语句,所以查出来的结果让人觉得没有确定性。

原本觉得这技术很不错,但真正研究起来,发现问题还是很多,研究到最后觉得这技术对柳永法(yongfa365)'Blog来说,只会用到对精确度不高的场合,像:CMS系统,大量文章,根据tag进行快速检索,这时他的快速检索优势能发挥出来,其它地方,真不敢用。像OA,各种业务系统,用他搜索不出要的东西,或者尝试很多次搜索,那用户还不郁闷死。暂且把研究结果放上来,以备后查。

前段时间做了个系统,记录客户的地址,下次再输入类似的地址,系统会进行分词,然后搜索看这个客户是不是已经在我们系统里了。感觉全文搜索能实现这样的功能就好了:就是,根据哪些词索引由用户自己定义(如:朝阳区|海淀区|东城区|左家庄|中关村 等,整个北京的地名,也没多少关键词),只对这些词进行索引,这样一来查询速度会更快,全文目录所占的地方也会更小,不知为何SQL Server没提供这样的功能,也许这只是 个例 吧。

全文查询只需要几秒或更少的时间,具体取决于返回的行数。
可以对包含 char、varchar 和 nvarchar 数据的列创建全文索引。也可以对包含格式化二进制数据(如存储在 varbinary(max) 或 image 列中的 Microsoft Word 文档)的列创建全文索引。不能使用 LIKE 谓词来查询格式化的二进制数据。

创建全文索引 创建全文索引的一个前提是,表中必须有这样的一个索引“unique, single-column, non-nullable index”。大多数情况下,主键都会满足这样的要求。 SQL Server这样做的实际要求是: 1. 必须有非空索引(主键都会满足这样的要求)。 2. 索引必须作用在单独一个列上。复合主键是不满足这个要求,一个work around是可以新建立一列,如textid,int型,自增,并建立索引。 提示:如果你的主键过长,笔者也建议新建一个int型自增列,例如主键是GUID的话,那么创建全文索引开销会是非常巨大的。


 
最简步骤:(以AdventureWorks数据库中的databaselog表中的event字段为例)

 代码如下 复制代码
1、  启用全文索引:
use AdventureWorks
exec sp_fulltext_database 'enable'
2、  全文索引是存储在指定的文件系统中的,而不是SQLServer中。
exec sp_fulltext_catalog 'Cat_Desc', 'create', 'f:ft'
创建全文索引的目录
3、  对表创建全文索引
exec sp_fulltext_table 'databaselog', 'create', 'Cat_Desc',
'PK_DatabaseLog_DatabaseLogID'
在已有的表上根据已有的索引创建全文索引
 
4、  对表中的列添加全文索引
exec sp_fulltext_column 'databaselog', 'event', 'add'
 
5、  表启动完全填充
exec sp_fulltext_table 'databaselog', 'start_full'
 
6、  执行全文检索
select * from freetexttable(databaselog, event,'ALTER_TABLE');

注意事项:

•为了让全文搜索更好的运行,请选用nvarchar,放弃使用varchar 原因见:SQL Server全文搜索关于varchar与nvarchar的问题
•全文搜索不适合对精准度要求很高的场合,如,查找"show.aspx?id=",是查不出来的,推荐使用SQL Server CLR, 教程:SQL Server CLR 极速入门,启用、设计、部署、运行
•全文搜索最好是配合分词组件工作,分词后再使用全文搜索查找,分词组件见:盘古分词
操作:

1.确保服务已启用:在"SQL Server 配置管理器"里设置"SQL Server FullText Search"启动状态为"自动"
2.建全文索引最直观的方法是:右击相关表-->全文索引-->定义全文索引-->然后基本上是下一步就完成了。
最常用语法:

 代码如下 复制代码

SELECT * FROM [test] WHERE CONTAINS(UserName,'柳永法');
SELECT * FROM [test] WHERE CONTAINS(Address,'山西 or 天津');
SELECT * FROM [test] WHERE CONTAINS(Address,'山西 and 天津');

SQL Server全文搜索关于varchar与nvarchar的问题

SQL Server全文搜索有一个问题,就是记录不全,上周末经过分析发现,

1.字段类型是varchar 且 如果搜索的的词正好是文章的结尾,就搜索不到,解决方法是在他后边再加上一个.让他不是在文章最后就行
2.字段类型换成nvarchar后,问题解决

 代码如下 复制代码

CREATE DATABASE test

USE test
DROP TABLE test
--建测试表
CREATE TABLE test
    (
      id INT IDENTITY(1, 1) PRIMARY KEY ,
      txtTitle1 VARCHAR(50) ,--这里用的是varchar
      txtTitle2 NVARCHAR(50) ,--这里用的是nvarchar
    )
   
--插入50条数据
DECLARE @i INT
SET @i = 0
WHILE @i     BEGIN
        INSERT  INTO test
                ( txtTitle1, txtTitle2 )
        VALUES  ( '柳永法', '柳永法')
        SET @i = @i + 1
    END

--对test表建全文索引,列选择txtTitle1, txtTitle2。方法如下:
--右击要建全文索引的表-->全文索引-->定义全文索引-->点几下"下一步"直到“选择表列”
-->选中要建立全文索引的列-->下一步-->自动-->创建新目录(写上名称,选位置,其它自便)
-->点几下"下一步"直到完成,这时系统会开始建全文目录,建好没有可以在当前数据库所在:
--展开当前数据库-->存储-->全文目录-->右击,你刚才起的名,如果“重新生成”是灰色,
--说明系统当前正在生成,如果可以点,说明生成完了

 

 代码如下 复制代码

--针对varchar的列txtTitle1 只要查询里是以 '法' 结尾,都查不出记录来
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle1,'柳永法'); --0
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle1,'柳'); --50
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle1,'永'); --50
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle1,'法'); --0
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle1,'柳永'); --50
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle1,'永法'); --0
SELECT REPLICATE('-',20)
--针对nvarchar的列txtTitle2 都可以查出全部记录
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle2,'柳永法'); --50
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle2,'柳'); --50
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle2,'永'); --50
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle2,'法'); --50
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle2,'柳永'); --50
SELECT COUNT(id) FROM dbo.test WHERE CONTAINS(txtTitle2,'永法'); --50

--在txttitle列末尾随便加一个字符
UPDATE test SET txttitle1=txttitle1+'.'

   
--重建索引后,再执行上面的查询,结果都 是50


--通过以上示例得出结论:只要在设计字段时把varchar改成nvarchar,就可以解决我们的问题,且nvarchar有个好处就是:如果数据库服务器部署在非中文的系统上时,不会出现乱码问题。

详细的全文搜索参考http://msdn.microsoft.com/zh-cn/library/ms142571(v=SQL.100).aspx

全文检索很容易建立,一旦建立,快速的响应将给使用者和用户带来惊喜!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java開發:如何實作搜尋引擎和全文檢索功能 Java開發:如何實作搜尋引擎和全文檢索功能 Sep 21, 2023 pm 01:10 PM

Java開發:如何實現搜尋引擎和全文檢索功能,需要具體程式碼範例搜尋引擎和全文檢索是現代網路時代的重要功能。它們不僅可以幫助用戶快速找到想要的內容,還可以為網站和應用程式提供更好的用戶體驗。本文將介紹如何使用Java開發搜尋引擎和全文檢索功能,並提供一些具體的程式碼範例。使用Lucene函式庫實作全文檢索Lucene是一款開源的全文檢索引擎函式庫,由ApacheSo

使用Go語言編寫高效能的全文檢索引擎 使用Go語言編寫高效能的全文檢索引擎 Jun 15, 2023 pm 11:51 PM

隨著網路時代的到來,全文檢索引擎越來越受到人們的重視。在無數的網頁、文件和資料中,我們需要快速找到所需的內容,這就需要使用高效率的全文檢索引擎。 Go語言是一種以效率而聞名的程式語言,它的設計目標是提高程式碼的執行效率和效能。因此,使用Go語言編寫全文檢索引擎可以大大提高其運作效率和效能。本文將介紹如何使用Go語言撰寫高效能的全文檢索引擎。一、理解全文檢索引擎

PHP與Elasticsearch整合實作全文檢索功能詳解 PHP與Elasticsearch整合實作全文檢索功能詳解 Jun 25, 2023 am 10:14 AM

隨著網路的發展,企業面對的文字資料越來越龐大。如何快速、精確地檢索相關內容,成為企業在資訊化領域的重要議題之一。 Elasticsearch作為一個基於Lucene的開源搜尋引擎,具有高可用性、高可擴展性和快速檢索的特點,成為企業全文檢索的首選方案之一。而PHP作為一門流行的伺服器端程式語言,也能夠快速進行Web開發與API開發,成為與Elasticsea

PHP開發即時聊天功能的全文檢索與訊息搜尋技術 PHP開發即時聊天功能的全文檢索與訊息搜尋技術 Aug 13, 2023 pm 06:51 PM

PHP開發即時聊天功能的全文檢索和訊息搜尋技術隨著即時通訊的普及和應用的擴大,即時聊天功能已成為許多網站和應用的必備特性。在即時聊天中,用戶可以發送和接收訊息,並允許用戶搜尋歷史訊息進行回顧和尋找。為了實現這項功能,我們可以採用全文檢索和訊息搜尋技術。全文檢索是指在大量文字中快速搜尋關鍵字的技術。它可以有效提高訊息搜尋的效率和準確性。在PHP開發中,我們

PHP學習指南:如何實作全文檢索功能 PHP學習指南:如何實作全文檢索功能 Aug 26, 2023 pm 06:04 PM

PHP學習指南:如何實現全文檢索功能全文檢索功能在現代網站和應用中被廣泛使用,它允許使用者透過關鍵字搜尋並檢索相關的內容。在本文中,我們將討論如何使用PHP實現全文檢索功能。一、準備工作在開始編寫程式碼之前,我們需要確保伺服器上安裝了Elasticsearch。 Elasticsearch是一個開源的用於全文搜尋和分析的伺服器端工具,它提供了一個強大的搜尋引擎,

PHP中如何進行全文檢索? PHP中如何進行全文檢索? May 13, 2023 am 08:00 AM

隨著網路技術的不斷發展,資料量的爆炸性成長和各種文字資料的廣泛應用,全文檢索成為了非常重要的技術。全文檢索是一種能夠快速、準確地找到文字資料的方法,廣泛應用於搜尋引擎、論壇、部落格、電商網站等應用程式場景。在PHP程式設計中,如何實現全文檢索呢?一、什麼是全文檢索?在傳統的關係型資料庫中,我們通常會使用SQL語句進行模糊查詢,但是當資料量較大時,這種查詢方法會

PHP開發:如何使用 Elasticsearch 實現全文檢索 PHP開發:如何使用 Elasticsearch 實現全文檢索 Jun 14, 2023 pm 05:07 PM

在現代Web應用程式中,資料量越來越大,但使用者期望和對資料的存取也越來越廣泛。因此,搜尋技術變得越來越重要,能夠滿足用戶的預期並提供更好的用戶體驗。全文搜尋是一種強大的技術,能夠快速索引、搜尋和排序大量資料。在這方面,Elasticsearch是一個領先的開源搜尋引擎,它提供了許多先進的特性以及高可用性、易擴展性等優勢。在本篇文章中,將介紹如何透過PHP使用

Swoole與ElasticSearch的完美結合:建立高效能的全文檢索引擎 Swoole與ElasticSearch的完美結合:建立高效能的全文檢索引擎 Jun 14, 2023 pm 12:44 PM

隨著雲端運算和大數據技術的不斷發展,全文檢索引擎的應用越來越廣泛,成為資料分析、智慧搜尋、資訊管理等領域中不可或缺的一部分。而在全文檢索引擎的實作中,Swoole和ElasticSearch無疑是兩個強大的工具,結合起來可以建構高效能的全文檢索引擎。 Swoole是一個基於PHP語言的高效能網路通訊框架,它支援多進程、協程、非同步、並發等特性。 ElasticSea

See all articles