【问题标题】:Search in multiple tables with Full-Text使用全文搜索多个表
【发布时间】:2010-12-28 16:12:17
【问题描述】:

我正在尝试使用 asp 和 SQL Server 全文进行详细搜索。

当一个关键字提交时,我需要在多个表中进行搜索。例如,

表 - 成员

  • member_id
  • contact_name

表 - 教育

  • member_id
  • school_name

我的查询;

select mem.member_id, mem.contact_name, edu.member_id, edu.school_name from Members mem FULL OUTER JOIN Education edu on edu.member_id=mem.member_id where CONTAINS (mem.contact_name, '""*"&keyword&"*""') or CONTAINS (edu.school_name, '""*"&keyword&"*""') order by mem.member_id desc;

此查询有效,但执行需要很长时间。

关键词是菲尔的图片;如果mem.contact_name 匹配,则列出它,或者如果edu.school_name matches,列出其教育与关键字匹配的人。

我希望我能解释清楚:) 不过我的英语很抱歉。

【问题讨论】:

  • 顺便说一句,我不能使用Union,因为成员和教育领域不一样。我还需要在 Members 表的 contact_address 中进行搜索。
  • 您可能会发现这个问题的答案很有用:stackoverflow.com/questions/2063561/…。

标签: sql-server inner-join multiple-tables full-text-search


【解决方案1】:

也许尝试一个包含合并数据集的索引视图 - 您可以在其中添加全文索引而不是单个表,并且它可以进一步扩展到您需要的尽可能多的表。唯一的窍门当然是空间……

【讨论】:

    【解决方案2】:

    这就是我的多表全文搜索要做的事情。

    不准确,但它会给出基本的想法。关键是给表虎钳包含 OR 条件。

    DECLARE  @SearchTerm NVARCHAR(250)
        
    SET @SearchTerm = '"Texas*"'
    
    SELECT * FROM table1 
    JOIN table2 on table1.Id = table2.FKID
    WHERE (
            (@SearchTerm = '""') OR 
            CONTAINS((table1.column1, table1.column2, table1.column3), @SearchTerm) OR 
            CONTAINS((table2.column1, table2.column2), @SearchTerm)
          )
    

    【讨论】:

      【解决方案3】:

      我不明白这会影响您的速度。

      1. 您真的需要完全外部联接吗?那是要了你的命。看起来这些表是一对一的。在这种情况下,您不能将其设为内部连接吗?
      2. 你不能像这样传递一个列列表来包含:

        SELECT mem.member_id,
             mem.contact_name,
             edu.member_id,
             edu.school_name
        FROM members mem
            INNER JOIN education edu ON edu.member_id = mem.member_id
        WHERE Contains((mem.contact_name,edu.school_name),'*keyword*')
        ORDER BY mem.member_id DESC 
        

      关于contains的更多信息。

      【讨论】:

      • Sql Server 无法进行前缀匹配,因此只有 'keyword*' 有用。另外:Msg 7646, Level 16, State 1, Line 7 Fulltext predicate references columns from two different tables or indexed views 'mem' and 'edu' which is not allowed.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      相关资源
      最近更新 更多