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)