【问题标题】:Fastest way to search a SQL Server table (or indexed view) column with "like '%search%'"?使用“like '%search%'”搜索 SQL Server 表(或索引视图)列的最快方法?
【发布时间】:2015-09-29 18:04:30
【问题描述】:

假设有一个包含列(UserIDFieldIDValue)的表,其中包含 50 万条记录。我想看看每个 Value (即 Value.Contains( T(N) ) )中的任何地方是否出现了某些搜索词 T(N)。

我想我只是在数量上碰壁了,太多的价值无法筛选。我不认为全文索引会有所帮助,因为它只对查看单个单词的StartsWith 查询有用,而不是在字符串中的任何位置出现。

有没有一种好的方法可以为 SQL Server 中的此类搜索索引此类数据?

【问题讨论】:

  • 什么样的“价值”?就几个字,长篇大论?

标签: search sql-server-2012 full-text-search


【解决方案1】:

50 万条记录并不是很大,虽然我不知道字段内容的大小。一些想法 - 评论太长了,否则我可能已经发布了。

您可以实现一个全文搜索引擎,如 Elastic、Solr 等,并将其用作 sidecar。如果您在进行文本搜索时并没有过多地使用其他数据,那么这可能很容易。请注意,您可以将用于搜索的其他数据放入 Elastic 或 Solr,但我不确定您是否想要复制所有数据,而且这些工具对于事务数据存储来说并不是很好。

对于这么小的卷的另一个选项,假设您只需要基本的“包含”搜索:再创建两个表:keywords 和keyword_index(或其他)。保存时,标记您的文本内容并将任何新关键字写入关键字表,然后将数据添加到连接表。索引所有内容,然后在关键字表中进行搜索,通过中间的关键字索引表连接到主数据库。

这是相当骇人听闻的,让您的关键字处理真正拨入(用于词干等)可能会很痛苦。不过,对于较小规模的需求,这是一个合理的快速而肮脏的解决方案。

【讨论】:

  • 这些值平均 7 个字符,最小长度为 1,最大长度为 88。我决定实现字符对的 2 级深度反向索引,它将指向匹配的记录(它实际上将支持 N 级深度)。有 1,311,126 对字符(在每个值的末尾用空格填充),但只有 1,242 个 unique 对。 Sqrt(1242) ~ 36,所以平均大约有 36 个唯一字符。我设法用一个类和大约 50 行代码实现了这样一个索引,现在它允许搜索以极快的速度完成。耶。
  • @Triynko - 听起来像一个很好的方法和字符对索引,如果我正确(或大致如此)想象实现应该避免我提到的蛮力大索引方法中的一些问题作为第二种选择。
猜你喜欢
  • 2014-10-18
  • 2011-03-30
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 2011-08-25
  • 2012-03-01
相关资源
最近更新 更多