全文索引缓慢.寻找替代品

tpt*_*cat 11 performance jquery full-text-search autocomplete sql-server-2008

我有一张桌子,我已经创建了一个全文目录.该表只有6000多行.我在索引中添加了两列.第一个可以被认为是排序的唯一标识符,第二个可以被认为是该项目的内容(我的表中 11个其他列不是全文目录的一部分).以下是几行的示例:

TABLE: data_variables
ROW    unique_id    label
1      A100d1       Personal preference of online shopping sites
2      A100d2       Shopping behaviors for adults in household
Run Code Online (Sandbox Code Playgroud)

在我前端的Web应用程序中,我有一个文本框,用户可以输入该文本框以获取与他们在UNIQUE IDLABEL列中搜索的任何术语匹配的项目列表.因此,例如,如果用户键入shoa100然后列表将填充上面的两个行.如果他们键入,behav则列表将仅填充上面的第2行.

这是通过每个上面的Ajax请求完成的keyup.PHP在SQL服务器上调用存储过程,如下所示:

SELECT TOP 50 dv.id, dv.id + ': ' + dv.label, 
              dv.type_id, dv.grouping, dv.friendly_label
FROM          data_variables dv
WHERE         (CONTAINS((dv.unique_id, dv.label), @search))
Run Code Online (Sandbox Code Playgroud)

(@search是传递给存储过程的用户的文本.)

我注意到这变得非常缓慢,特别是当我没有TOP 50在查询中使用时.

我正在寻找的方法是直接在SQL Server上加速,或者放弃全文索引的想法,并使用jQuery在客户端搜索可搜索项目的数组.我看了一下jQuery AutoComplete的东西以及其他一些用于AutoComplete的jQuery插件,但还没有尝试模拟任何东西.这将是我的下一步,但我想先在这里查看,看看我会得到什么建议.

提前致谢.

Luk*_*uke 6

除非你使用线性索引(从左到右)并且你正在进行类似的查询,否则我会建议不要使用LIKE LIKE 'work%'.如果你正在做一些像LIKE '%word%'常规索引这样的事情对你没有帮助.当您想要搜索段落中的单词时,通常需要使用全文索引.

对于大量数据,通常数据库中的内置全文引擎并不是非常盗取.为了获得最佳性能,您通常必须使用专为全文构建的外部解决方案.

一些选项是Sphinx,Solrelasticsearch,仅举几例.我不会说这些选项中的任何一个都比另一个更好.肯定有利有弊,需要考虑:

  • 你有什么样的数据?
  • 这些解决方案有哪些语言支持?
  • 这些解决方案支持哪些数据库引擎?

您可以做的最好的事情是根据现有数据对这些解决方案进行基准测试 测试每个单独的组件(单元测​​试)可以帮助您识别真正的问题并帮助您找到好的解决方案.


rlb*_*rlb 5

几个建议,基于你只有6000行的事实,所以数据库应该活着吃这个.

A.尝试使用Like运算符,以防它有所帮助.不要期待它,但尝试相当微不足道.这里还有其他一些东西可以让你发现这个小体积很慢.

B.您可以提前缓存查询吗?对于6000行,可能只有36*36个2个字符的查询组合,这几乎不需要任何内存并保存数据库的任何工作.

C.将选择移出到客户端是一个好主意,取决于总体上6000行的大小,以及单个查找的网络延迟.

D.结合b和c将给你非常好的表现我怀疑,但需要一些编码工作.如果服务器维护缓存中所有单个字符结果的列表,并且客户端在第一次击键后下载字母缓存集,那么它们可能具有所有行的子集,但不需要为额外的击键执行更多网络IO.


Zel*_*oss 5

我有同样的问题,并采取LIKE解决方案.我发现,或者运算符过于繁重,并且将查询分成两个选项并使用union all(最快,在我的场景中,无法在索引列和数据中找到相同的文本).

你的意思是

SELECT TOP 50 from (
select dv.id, dv.id + ': ' + dv.label, 
              dv.type_id, dv.grouping, dv.friendly_label
FROM          data_variables dv
WHERE         dv.unique_id like '%'+@search+'%'
UNION ALL
select dv.id, dv.id + ': ' + dv.label, 
              dv.type_id, dv.grouping, dv.friendly_label
FROM          data_variables dv
WHERE         dv.label like '%'+@search+'%' 
)
Run Code Online (Sandbox Code Playgroud)

哦!!并测试SQL Server中的性能,而不是Web!