【发布时间】:2014-11-20 18:38:03
【问题描述】:
我想让用户在表中的所有列中搜索文本框中定义的一组短语(用空格分割术语)。 所以首先想到的是在 SQL 中找到一种方法来连接所有列,并在这个结果中只使用 LIKE 运算符(对于每个短语)。 我想到的另一个解决方案是编写一个算法,该算法采用所有搜索的短语,并将它们与所有列匹配。 所以我最终得到了以下结果:
String [] columns = {"col1", "col2", "col3", "col4"};
String [] phrases = textBox.Text.Split(' ');
然后我将所有可能的列和短语组合,并将其放入 sql 的 where-clause-format 中,然后结果是
"(col1 LIKE '%prase1%' AND col1 LIKE '%phrase2%') OR
(col1 LIKE '%phrase1%' AND col2 LIKE '%phrase2%') OR
(col1 LIKE '%phrase2%' AND col2 LIKE '%phrase1%') OR
(col2 LIKE '%phrase1%' AND col3 LIKE '%phrase2%')"
以上只是输出的一个示例sn-p,该算法中创建的条件数量由
conditions=columns^(phrases+1)
所以我观察到拥有 2 个搜索词组仍然可以提供良好的性能,但超过此数量肯定会大幅降低性能。
在所有列中搜索相同数据时的最佳做法是什么?
【问题讨论】:
-
您要搜索多大的表?所有列都是字符字段吗?你需要担心区分大小写吗?
-
表中只有大约 500 行。除“价格”列外,所有列都是文本。我们制作了一个网络爬虫并将其限制在一个域中以检索有关所有产品的数据。我不担心区分大小写。
-
你应该寻找Full-Text Search
-
@VahidND 这是一个很好的建议,但我正在使用 Oracle(抱歉没有提及),看起来 CONTAINS 运算符使用加权因子,它返回包含至少一个的所有结果的短语。但我想我可以在需要创建的索引上使用 LIKE。
-
VahidND - 在他的示例中,他需要全文搜索不支持的后缀和前缀搜索(至少没有插入反向文本的技巧),并且对于 500 行来说这可能是矫枉过正。我可能会创建一个包含所有字段组合的视图,然后调用使用临时表进行匹配的存储过程。