我正试图围绕如何搜索出现在单词/表达式中间的东西——比如搜索“LIKE %book%”——但在 SQL Server (2005) 全文目录中。
我怎样才能做到这一点?在搜索表达式的开头几乎看起来两者都支持通配符,CONTAINS
而且FREETEXT
真的不支持通配符- 真的可以吗?
我原以为FREETEXT(*, "book")
会发现里面有“书”的任何东西,包括“重新预订”或类似的东西。
我正试图围绕如何搜索出现在单词/表达式中间的东西——比如搜索“LIKE %book%”——但在 SQL Server (2005) 全文目录中。
我怎样才能做到这一点?在搜索表达式的开头几乎看起来两者都支持通配符,CONTAINS
而且FREETEXT
真的不支持通配符- 真的可以吗?
我原以为FREETEXT(*, "book")
会发现里面有“书”的任何东西,包括“重新预订”或类似的东西。
不幸的是 CONTAINS 只支持前缀通配符:
CONTAINS(*, '"book*"')
SQL Server 全文搜索基于将文本标记为单词。单词没有更小的单位,所以你能找到的最小的东西就是单词。
您可以使用前缀搜索来查找以某些字符开头的匹配项,这是可能的,因为单词列表按字母顺序保存,服务器所要做的就是扫描列表以查找匹配项。
要执行您想要的带有LIKE '%book%'
子句的查询,可能会同样快(或慢)。
如果你想做一些严肃的全文搜索,那么我会(并且已经)使用 Lucene.Net。除了基础知识之外,MS SQL 全文搜索似乎从来没有那么好用。
这是一个解决通配符限制的建议。您创建一个包含相同内容但与您正在搜索的列相反的计算列。
例如,如果您正在搜索名为“ProductTitle”的列,则创建一个名为 ProductsRev 的列。然后将该字段的“计算列规范”值更新为:
(反向([产品标题]))
在您的搜索中包含“ProductsRev”列,您现在应该能够返回支持在单词开头使用通配符的结果。祝你好运!!
全文有一个表格,列出了引擎找到的所有单词。它的行数应该比全文索引表少几个数量级。您可以从该表中选择“where field like '%book%'”来获取所有包含“book”的单词。然后使用该列表编写全文查询。它很麻烦,但它会起作用,而且在速度部门也可以。但是,最终您在执行此操作时使用的是错误的全文。实际上,最好让这些功能请求的来源了解全文在做什么。您希望他们了解它想要做什么,这样他们就可以从全文中获得高价值。例如,仅在单词末尾使用通配符,这意味着考虑有序列表中的单词。
为什么不在 C# 中编写程序集来计算所有不重复的后缀。例如,如果您有文本“吃红肉”,则可以将“吃在他的红肉”字段中(请注意,不必再次添加“吃”和“吃”),然后在该字段中使用全文搜索。一个可以很容易地用 Csharp 编写的函数
x)我知道这看起来很奇怪......这是一个工作方法 x)我知道我在插入/更新中增加了开销......只有当这个开销除了搜索功能的改进之外微不足道时才合理 x)我知道那里也是存储数据大小的开销。
但我很有信心会很快