【问题标题】:Full text search with special characters带有特殊字符的全文搜索
【发布时间】:2016-05-30 21:01:20
【问题描述】:

我有一个表格,其中包含“F-10”或“Jim-beam”等值。如果用户搜索说“F10”或“Jimbeam”,我有没有办法获得这些结果?基本上,用户可能不知道条目中有破折号,但我希望搜索足够宽容以找到它。

现在我正在尝试使用:

SELECT *
WHERE
    CONTAINS(table.*, ,'"F10*" Or "Jimbeam*"')

【问题讨论】:

  • 运行代码时会发生什么?
  • @TomH 结果都不返回。如果我搜索“F*”或“Jim*”,那么它会起作用,但实际上我不能随意分解这样的字符串。
  • 同义词库文件可能能够满足您的需求,但我没有足够的经验来发布有关该主题的完整解决方案。

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


【解决方案1】:

您可以创建数组以从用户那里获取插入的值

然后对数组中的每个值使用 like %value1% 或 like %value2%

这可能是一个解决方案

【讨论】:

  • 它会搜索用户输入的值的每一部分,所以如果用户输入f10,它会带来F-10
  • 你怎么知道在哪里把字符串分成数组?分隔符在哪里?如果用户键入 jimbeam 是什么让你让 value1= jim 和 value2=beam 而不是 value1=jimbe value2=am ?
  • 你可以数数或者用函数来区分数字和字符
  • “jimbeam”之间没有数字
【解决方案2】:

您可以尝试将数据库中的值替换为不包含任何特殊字符的值。我之前使用过此答案中描述的功能:https://stackoverflow.com/a/1008566/894974 因此,安装了该功能后,您的 where 子句将变为:

where dbo.RemoveNonAlphaCharacters([columnToSearch]) like '%'+@searchString+'%'

【讨论】:

  • 我喜欢这个答案,但它看起来不像该函数接受一列,只是一个字符串。有没有办法让我通过整个专栏?希望这不会大大减慢搜索速度,但慢总比没有好。
【解决方案3】:

您可以创建一个单独的列,从这些单词中删除短划线,然后针对该列执行全文搜索。

例如,您的表格可能如下所示(或者新列可能是新表格的一部分):

Id  Text            TextForFullTextSearch
-----------------------------------------
1   Jim-beam        Jimbeam
2   F-10            F10
3   blah blah       blah blah

如果您需要同时支持对"Jimbeam*" 和"Jim-beam*" 的搜索,那么您可以对旧列和新列执行全文搜索。

这确实需要您将文本存储两次,以便您的过程中有更多的齿轮。好处在于搜索的准确性和性能(LIKE 会慢得多),因此您必须权衡这些好处与增加的复杂性。

在插入和更新数据时填充新列的一些想法:

  • 在您的数据层处理此问题,即所有插入和更新语句都应包括 Text 和 TextForFullTextSearch。
  • 向表中添加一个插入/更新触发器,每当插入或更新 Text 时,该触发器就会同时更新 TextForFullTextSearch。
  • 创建一个自动化作业,不断轮询表中的插入/更新,然后相应地更新 TextForFullTextSearch。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多