【问题标题】:SQL Contains QuestionSQL 包含问题
【发布时间】:2011-10-21 04:39:45
【问题描述】:

谁能给我解释一下?我在下面有两个查询及其结果。


查询

select * from tbl where contains([name], '"*he*" AND "*ca*"')

结果集

赫兹租车

海明威的小酒馆


查询

select * from tbl where contains([name], '"*he*" AND "*ar*"')

结果集

什么都没有


第一个查询是我所期望的,但我希望第二个查询返回“Hertz Car Rental”。我是否从根本上误解了“*”在全文搜索中的工作原理?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    我认为 SQL Server 将您的字符串解释为 prefix_terms。星号不是普通的旧通配符说明符。全文和包含是面向单词的。对于您正在尝试做的事情,最好使用普通的旧 LIKE 而不是 CONTAINS。

    http://msdn.microsoft.com/en-us/library/ms187787.aspx

    【讨论】:

    • +1 '*' 通配符只能用于前缀匹配,第一个示例中必须忽略模式字符串中的第一个。 @hatchet 推荐 LIKE 来代替这种用法是正确的(或者如果你想要真正的“模糊”匹配,就把通配符放在一起?)
    • 我想我从根本上误解了一切,不是吗。感谢大家的澄清。我想我们将只进行前缀搜索,因为我们已经确定 LIKE 的性能不够。
    【解决方案2】:

    "*" 仅用作后缀。如果使用它作为前缀,则无论如何都需要扫描表,并且索引是无用的。到时候你也可以这样做

      Select * From Table Where (Name Like '%he%') And (Name Like '%ar%')
    

    【讨论】:

      【解决方案3】:

      我会尝试用 % 替换 * 来看看效果如何。

      select * from tbl where contains([name], '"%he%" AND "%ar%"') 
      

      【讨论】:

      • 那没有任何作用。 CONTAINS 不是 LIKE。
      • % vs * 似乎没有破坏第一个查询;为什么会搞砸第二个?
      猜你喜欢
      • 2011-11-24
      • 2011-02-09
      • 2010-09-08
      • 1970-01-01
      • 2014-10-09
      • 2011-06-27
      • 2021-08-19
      相关资源
      最近更新 更多