Sql server 可搜索文本在两个表中,如何设计全文索引?
在论坛应用程序中,线程的实际名称存储在一个表中,然后回复存储在另一个表中Sql server 可搜索文本在两个表中,如何设计全文索引?,sql-server,sql-server-2005,full-text-search,Sql Server,Sql Server 2005,Full Text Search,在论坛应用程序中,线程的实际名称存储在一个表中,然后回复存储在另一个表中 Table_Thread Subject varchar(255) e.g. "How to setup fulltext search" Table_Replies (users replies here) ReplyText text(not null) 现在我想在主题和回复列上创建一个全文搜索,但是它们看起来非常相关,所以它们应该在同一个索引中 有可能这样做吗 我正在使用sql server 2005。假
Table_Thread
Subject varchar(255) e.g. "How to setup fulltext search"
Table_Replies (users replies here)
ReplyText text(not null)
现在我想在主题和回复列上创建一个全文搜索,但是它们看起来非常相关,所以它们应该在同一个索引中
有可能这样做吗
我正在使用sql server 2005。假设主题和回复之间存在关联,您可以使用SCHEMABINDING创建一个视图
,在视图上创建一个独特的聚集索引,然后将该视图添加到您的全文目录中,选择您想要包含的两列。当出现大量并发查询请求时,RDBMS无法通过SQL实现。此外,selectsql还不支持全文搜索。所以您需要IR(信息检索)库,比如Lucene for java 您可以创建一个索引视图,其中包含两个索引列的并集+表的主键
e、 g
我认为类型1和2是任意的,因为您需要一个唯一的键来构建全文索引。
然后在(ID,Type)上创建一个唯一的索引,最后是全文索引
CREATE UNIQUE INDEX SearchText_UK ON SearchText (ID, Type);
CREATE FULLTEXT CATALOG ft AS DEFAULT;
CREATE FULLTEXT INDEX ON SearchText(Text)
KEY INDEX SearchText_UK
WITH STOPLIST = SYSTEM;
我看到了NopCommerce(C#MVC开源电子商务)使用全文搜索“产品”和“变体”并只返回“产品”的做法。这与您的情况非常相似,因为您希望搜索“线程”和“回复”,但您显然只希望返回“线程”。我已将其更改为使用线程和回复:
首先,创建一个按表生成索引名的函数(可选):
然后,通过创建目录和索引启用全文:
EXEC('
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_catalogs WHERE [name] = ''myFullTextCatalog'')
CREATE FULLTEXT CATALOG [myFullTextCatalog] AS DEFAULT')
DECLARE @create_index_text nvarchar(4000)
SET @create_index_text = '
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_indexes WHERE object_id = object_id(''[Table_Thread]''))
CREATE FULLTEXT INDEX ON [Table_Thread]([Subject])
KEY INDEX [' + dbo.[nop_getprimarykey_indexname] ('Table_Thread') + '] ON [myFullTextCatalog] WITH CHANGE_TRACKING AUTO'
EXEC(@create_index_text)
SET @create_index_text = '
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_indexes WHERE object_id = object_id(''[Table_Replies]''))
CREATE FULLTEXT INDEX ON [Table_Replies]([ReplyText])
KEY INDEX [' + dbo.[nop_getprimarykey_indexname] ('Table_Replies') + '] ON [myFullTextCatalog] WITH CHANGE_TRACKING AUTO'
EXEC(@create_index_text)
然后,在按关键字获取产品的存储过程中,使用与关键字匹配的产品ID列表构建一个临时表
INSERT INTO #KeywordThreads ([ThreadId])
SELECT t.Id
FROM Table_Thread t with (NOLOCK)
WHERE CONTAINS(t.[Subject], @Keywords)
UNION
SELECT r.ThreadId
FROM Table_Replies r with (NOLOCK)
WHERE CONTAINS(pv.[ReplyText], @Keywords)
现在,您可以使用临时表#KeywordThreads
加入线程列表并返回它们
我希望这有帮助。这两个表之间有什么关联吗?
EXEC('
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_catalogs WHERE [name] = ''myFullTextCatalog'')
CREATE FULLTEXT CATALOG [myFullTextCatalog] AS DEFAULT')
DECLARE @create_index_text nvarchar(4000)
SET @create_index_text = '
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_indexes WHERE object_id = object_id(''[Table_Thread]''))
CREATE FULLTEXT INDEX ON [Table_Thread]([Subject])
KEY INDEX [' + dbo.[nop_getprimarykey_indexname] ('Table_Thread') + '] ON [myFullTextCatalog] WITH CHANGE_TRACKING AUTO'
EXEC(@create_index_text)
SET @create_index_text = '
IF NOT EXISTS (SELECT 1 FROM sys.fulltext_indexes WHERE object_id = object_id(''[Table_Replies]''))
CREATE FULLTEXT INDEX ON [Table_Replies]([ReplyText])
KEY INDEX [' + dbo.[nop_getprimarykey_indexname] ('Table_Replies') + '] ON [myFullTextCatalog] WITH CHANGE_TRACKING AUTO'
EXEC(@create_index_text)
INSERT INTO #KeywordThreads ([ThreadId])
SELECT t.Id
FROM Table_Thread t with (NOLOCK)
WHERE CONTAINS(t.[Subject], @Keywords)
UNION
SELECT r.ThreadId
FROM Table_Replies r with (NOLOCK)
WHERE CONTAINS(pv.[ReplyText], @Keywords)