【问题标题】:searching for records using Full text search across multiple tables使用全文搜索跨多个表搜索记录
【发布时间】:2012-07-27 05:52:21
【问题描述】:
SELECT A.a, B.b, akt.[Rank] + bkt.[Rank] /2  AS [Rank]
FROM B b
INNER JOIN Publication a ON a.Id = b.Id
INNER JOIN FREETEXTTABLE(A, a, 'search text') akt ON a.Id = akt.[Key]
INNER JOIN FREETEXTTABLE(B, b, 'search text') bkt ON b.Id = bkt.[Key] 
ORDER BY [Rank] DESC

UNION
SELECT A.a, null as B.b, akt.[Rank] as [Rank]
FROM A a
INNER JOIN FREETEXTTABLE(A, a, 'search text') akt ON a.Id = akt.[Key]

UNION
SELECT null as A.a, B.b, bkt.[Rank] as [Rank]
FROM B b
INNER JOIN FREETEXTTABLE(A, a, 'search text') akt ON a.Id = akt.[Key]

上述查询用于跨两个表搜索记录(使用排名)。

第一个查询:只有搜索文本在两个表的列中的那些记录才会显示。

第二次查询:只有那些searchtext只在表A的a列中的记录

第三次查询:只有那些searchtext只在表B的b列中的记录

我的问题是:如果我必须搜索 4 或 5 个表,UNION 的数量会疯狂增加。它也会太复杂和太慢。

那么,还有其他方法可以减少这些 UNION 吗? 我试过视图,但它们不能被全文索引。

【问题讨论】:

    标签: sql-server full-text-search


    【解决方案1】:

    只需使用全连接

    SELECT A.a, B.b, "Use case for calculating rank"
        FROM B b
        FULL JOIN A a ON b.Id = a.Id
    WHERE
        a.[columnname] = 'search text' OR
        b.[columnname] = 'search text' 
    

    查看http://codesnout.com/SQLSample/SQL-FULL-JOIN.php

    【讨论】:

    • 谢谢Rain,这是有效的,但排名仅针对两列中的记录,对于其他列,Rank = NULL
    • 是的,排名将为空。这就是为什么我告诉你使用大小写来计算排名。请显示您正在使用的确切脚本,然后我会检查。
    【解决方案2】:
    SELECT b.FK_Publication_ID, b.PageNumber as PageNumber, b.SearchText as SearchText, a.Title as Title , 
    TitleSearch.[Rank] + PubSearch.[Rank] * 10000
      AS [Rank]
    FROM PublicationSearch 
    INNER JOIN Publication a ON b.FK_Publication_Id = a.Id
    INNER JOIN FREETEXTTABLE(PublicationSearch, SearchText, "searchtext") PubSearch ON b.Id = PubSearch.[Key] 
    INNER JOIN FREETEXTTABLE(Publication, Title, "searchtext") TitleSearch ON a.Id = TitleSearch.[Key] 
    WHERE b.FK_ContentType_Id IN (SELECT * FROM UF_CSVToTable(@Options))
    
    UNION 
    
    
    SELECT  a.Id, null as PageNumber, null as Searchtext, a.Title as Title, TitleSearch.[Rank] * 100  AS [Rank]
    FROM Publication a
    INNER JOIN FREETEXTTABLE(Publication,Title, "searchtext") TitleSearch ON a.Id = TitleSearch.[Key]
    
    
    UNION
    
    SELECT b.FK_Publication_ID, b.PageNumber as PageNumber, b.SearchText as SearchText, null as Title, 
    PubSearch.[Rank] 
      AS [Rank] 
    FROM PublicationSearch b
    INNER JOIN FREETEXTTABLE(PublicationSearch, SearchText, "searchtext") PubSearch ON b.Id = PubSearch.[Key] 
    
    ORDER BY [Rank] DESC
    

    以上是使用UNION

    下面是你建议的

    选择 b.FK_Publication_ID,b.PageNumber 作为 PageNumber,b.SearchText 作为 SearchText,a.Title 作为 Title 作为 ContentType,

    TitleSearch.[Rank] * 100  (Ranking, dont know how to do it here)
      AS [Rank]
    FROM PublicationSearch b
    INNER JOIN Publication a ON b.FK_Publication_Id = a.Id
    JOIN FREETEXTTABLE(PublicationSearch, SearchText, "searchtext")PubSearch ON b.Id = PubSearch.[Key] 
    FULL JOIN FREETEXTTABLE(Publication, Title, "searchtext")TitleSearch ON a.Id = TitleSearch.[Key] 
    
    order by [RANK] desc
    

    这里,确切的脚本。使用完全联接,我从两个表和仅从 PublicationSearch 表中获取记录,但不仅从 Publication 表中获取记录

    此外,在两个表中找到的记录的排名应该更高,然后是仅来自 Publication 表的记录,然后是来自 PublicationSerach 表的记录

    谢谢..

    【讨论】:

      猜你喜欢
      • 2013-02-15
      • 2010-11-10
      • 1970-01-01
      • 2012-02-14
      • 2010-12-28
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      相关资源
      最近更新 更多