我们正在将应用程序的数据库迁移到Windows Azure SQL数据库。在应用程序中,有几个轻量级搜索功能,我们目前使用T-SQL和全文索引来处理搜索。但是,Azure中目前不提供全文索引。
我正在研究Lucene.Net之类的非SQL解决方案,它看起来很棒,但我认为这对我们正在努力做的事情来说可能有点过头了。我们搜索的数据集并不大 - 平均少于100,000条记录 - 而且只有少数几条。示例表可能看起来像这样......
CREATE TABLE dbo.Items(
[ItemID] [int] IDENTITY(1,1) NOT NULL,
[Author] [varchar](255) NULL,
[Subject] [varchar](255) NULL,
[ItemContent] [nvarchar](max) NULL,
CONSTRAINT [PK_Items] PRIMARY KEY CLUSTERED ([ItemID] ASC)
)
...我们想要搜索Author,Subject和ItemContent字段。作者和主题可以是多个单词,ItemContent字段可以是几个段落,所以我看不出如何避免表扫描。全文索引表现得非常好,我不期待这样做:
SELECT ItemID FROM dbo.Items WHERE Author LIKE'%'+ @ SearchTerm +'%'OR subject LIKE'%'+ @ SearchTerm +'%'或ItemContent LIKE'%'+ @ SearchTerm +'%'
有人建议如何在不使用全文索引的情况下优化此类搜索吗?
答案 0 :(得分:0)
另一种方法是创建(如果不是完整的数据仓库解决方案),也许是一些非规范化的表,将这些列分成单个记录(或更少的记录)...所以你有一个db表w / just ItemId | CombinedSearchableInfo你的CombinedSearchableInfo可能是" Herman Melville Moby Dick",在这种情况下你正在做更少的计算工作(并且你可以使用不同的查询优化技术来做类似的事情)。您只需要在离线过程中维护搜索表...
请记住,尽管Lucene可以帮助解决拼写错误和相关性等问题,并且使用像书籍和作者这样的域名空间,拼写错误很有可能...
(另外,如果您正在进行天蓝色路线,那么您现在可以使用大量存储和blob存储的东西......您实际上可以运行带有全文索引的sql server作为blob的一部分存储而不必改装任何东西......你会失去azure sql的所有性能优势,但是嘿......它是一个选项)