【问题标题】:Full-search text query全搜索文本查询
【发布时间】:2009-08-14 11:48:20
【问题描述】:

我想将简单的全文搜索文本添加到我的 web 应用程序中,它可以接受多个单词进行搜索。
示例搜索条目:“在线 SQL 书籍”

我应该将其转换为:

WHERE (CONTAINS(myColumn,  '"Online*" and "sql*" and "books*"' ))  
or : WHERE (CONTAINS(myColumn,  '"Online* sql* books*"' ))  
or maybe: WHERE (CONTAINS(myColumn,  '"Online*"' ))  and (CONTAINS(myColumn,  '"SQL*"' ))  and (CONTAINS(myColumn,  '"books*"' ))    

或者最好使用 'FORMSOF(INFLECTIONAL('...

另一个问题,最好在我的业务对象内部的存储过程中构造查询,然后将其传递给存储过程?

【问题讨论】:

    标签: c# asp.net sql-server-2005 full-text-search


    【解决方案1】:

    使用 SQL 进行全文搜索的问题在于,它可能会非常慢并且会丢失您原本希望它成功的搜索。 SQL 搜索也不提供任何形式的数据排名,因此包含这些术语的任何文本最终都可能接近顶部。

    为了解决这两个问题,创建了Lucene.net 以允许简单地创建适当的词条目索引。通过这样做,它还可以查看特定条目中单词的使用频率并提供排名信息。您会发现它在查找结果和单次搜索的执行速度方面明显优于使用 SQL 执行任务,尤其是在扩展以支持更多搜索时。

    【讨论】:

      【解决方案2】:

      第一种形式很好 (CONTAINS(myColumn, '"Online*" and "sql*" and "books*"' )) - sql 无论如何都要花时间来解析查询。

      第二个问题是方便问题。如果你对 sql2005 中的字符串操作很好,那就去做吧。但是记住sql注入问题,所以检查两次。

      【讨论】:

      • 是的 sql-injection 很重要,那么什么会更安全、更快呢?
      • 我认为最好在业务对象中构造它而不是存储过程,因为您将在存储过程中创建额外的开销创建变量和连接值等(通常不是一个好习惯)。只需确保您清理 sql 字符串以避免如 Dewfy 所述的 sql 注入。
      • @Benjamin&Dewfy,我应该做什么(或不做什么)来防止 sql 注入?
      • 您可以首先检查您传递的字符串是否不包含 ' 字符,或者至少转义它。如果您不这样做,您最终可能会因安全原因而删除您的整个数据库。
      • @markiz 不同意 (")-quote 是 FTS 查询的重要部分,所以也包括它并检查是否总是有对
      猜你喜欢
      • 2011-12-06
      • 1970-01-01
      • 2023-04-01
      • 2014-05-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多