문제

나를 검색할 필요가 여러의 열 두 테이블에 데이터베이스를 사용하여 전체 텍스트 검색합니다.두 테이블에서 질문가 관련된 열에 전체 텍스트 색인.

이유는 내가 말인가에 대한 전체 텍스트 검색:1.검색 할 수 있 악센트 단어를 쉽게(cafè) 2.할 수 있게 순위에 따라 단어 호텔,etc.3."당신이 평균 XXX?"기능

테이블의 구조를 설명하기 위해 도전 과제:

테이블의 예약
BookID
Name (Full-text indexed)
Notes (Full-text indexed)

테이블의 선반
ShelfID
BookID

테이블 ShelfAuthor
AuthorID
ShelfID

테이블 작
AuthorID
Name (Full-text indexed)

야에서 검색을 예약,이름,책 주고자 이름입니다.

내가 알고 있는 두 가지 방법이:

  1. 를 사용하여 전체 텍스트 색인 보기: 이것이 나의 선호하는 방법,그러나 내가 이것을 할 수 없기 때문에 대한 전망 전체 텍스트 색인해야 합 스키마 바운드,어떤 외부 조인 고유 인덱스가 있습니다.View 나는 것입니다 얻을 필요가 내 데이터에 만족하지 않는 이러한 제한(그것을 담은 다른 많은 가입 테이블이 필요 데이터를 얻을에서).

  2. 를 사용하여 결합에 저장 프로시저:이 방법의 문제는 내가 필요로하는 결과가 있으로 정렬 순위입니다.내가 만드는 여러 조인에 걸쳐 테이블,SQL 서버지는 여러 분야에 의해 기본입니다.내가 결합 할 수 있습니다 두 개의 개별함에 대한 쿼리를 두는 연결된 테이블,지의 추출 결합 순위에서 두 개의 검색됩니다.예를 들면,나는 검색에 대한'아서',결과는 모두의 책 쿼리고 저자는 쿼리를 고려해야한다고 가중합니다.

도움이 되었습니까?

해결책

사용 FREETEXTTABLE,당신을 디자인하는 일을 계산하는 알고리즘을 병합 순위에 각각 가입 테이블의 결과입니다.아래의 예를 왜곡하는 결과를 향해 안에서 책이다.

SELECT b.Name, a.Name, bkt.[Rank] + akt.[Rank]/2 AS [Rank]
FROM Book b
INNER JOIN Author a ON b.AuthorID = a.AuthorID
INNER JOIN FREETEXTTABLE(Book, Name, @criteria) bkt ON b.ContentID = bkt.[Key] 
LEFT JOIN FREETEXTTABLE(Author, Name, @criteria) akt ON a.AuthorID = akt.[Key]
ORDER BY [Rank] DESC

참고는 간소화된 사용자 스키마에 대한 이 예입니다.

다른 팁

나는 당신과 같은 문제가지만 실제로 관련된 10 가지 테이블(사용자의 테이블과 여러 가지 다른 사람을 위한 정보)

나는 나의 첫 번째를 사용하여 쿼리 FREETEXT WHERE 절에서는 각 테이블을 쿼리를 복용까지 너무 오래입니다.

나는 다음 본 여러 가지 응답을 사용에 대한 FREETEXTTABLE 대신하고 확인하지 않는 null 값을 키 열에 대한 각각의 테이블,그러나 걸리는 또한 긴를 실행할 수 있습니다.

내가 고정된 그것의 조합을 사용하여 FREETEXTTABLE 와 조합을 선택:

SELECT Users.* FROM Users INNER JOIN
(SELECT Users.UserId FROM Users INNER JOIN FREETEXTTABLE(Users, (column1, column2), @variableWithSearchTerm) UsersFT ON Users.UserId = UsersFT.key
UNION
SELECT Table1.UserId FROM Table1 INNER JOIN FREETEXTTABLE(Table1, TextColumn, @variableWithSearchTerm) Table1FT ON Table1.UserId = Table1FT.key
UNION
SELECT Table2.UserId FROM Table2 INNER JOIN FREETEXTTABLE(Table2, TextColumn, @variableWithSearchTerm) Table2FT ON Table2.UserId = Table2FT.key
... --same for all tables
) fts ON Users.UserId = fts.UserId

이를 입증하는 믿을 수 없을 만큼 훨씬 빠릅니다.

내가 도움이 되기를 바랍니다.

나는 생각하지 않는 허용되는 답변 문제를 해결하는 것이다.는 경우에 당신을 찾아보십시오 모든 책에서 특정한 저자이며,따라서 사용할 저자의 이름(또는 그것의 일부)를 검색 기준으로만 책을 쿼리에서 반환하는 것이 그 어떤 검색 조건에서 자신의 이름이 있습니다.

유일한 방법은 내가 주위에 이 문제는 복제는 저자의 열을하고자하는 검색을해서 예약 테이블 및 인덱스 열(또는 열 때문에 그것은 아마도 스마트를 저장한 저자의 관련 정보 XML 란 책에서 테이블).

FWIW,비슷한 상황에서 우리의 DBA 만들어 DML 트리거를 유지 하는 전용 전체 텍스트 검색 표입니다.그것은 가능하지 않았을 사용하여 구체화하기 때문에 많은 제한이 있습니다.

나는 저장 프로시저를 사용합니다.전체 텍스트를 또는 어떤 방법을 반환합 순위를 정렬할 수 있습니다.나는 확실하지 않다 그들은 어떻게 될 것이 가중에 대하여 서로,하지만 나는 확신할 수 있습 팅커 잠시하고 있습니다.예를 들어:

Select SearchResults.key, SearchResults.rank From FREETEXTTABLE(myColumn, *, @searchString) as SearchResults Order By SearchResults.rank Desc

이 대답은 잘 연체이지만,이렇게 하는 방법 중 하나를 수정할 수 없는 경우 기본 테이블을 새로 생성된 테이블을 검색 매개변수를 추가하는 하나의 열입니다.

그런 다음 전체 텍스트 색인을 작성에는 열 및 쿼리하는 열이 있습니다.

SELECT 
    FT_TBL.[EANHotelID]                 AS HotelID, 
    ISNULL(FT_TBL.[Name],'-')           AS HotelName,
    ISNULL(FT_TBL.[Address1],'-')       AS HotelAddress,
    ISNULL(FT_TBL.[City],'-')           AS HotelCity,
    ISNULL(FT_TBL.[StateProvince],'-')  AS HotelCountyState,
    ISNULL(FT_TBL.[PostalCode],'-')     AS HotelPostZipCode,
    ISNULL(FT_TBL.[Latitude],0.00)      AS HotelLatitude,
    ISNULL(FT_TBL.[Longitude],0.00)     AS HotelLongitude,
    ISNULL(FT_TBL.[CheckInTime],'-')    AS HotelCheckinTime,
    ISNULL(FT_TBL.[CheckOutTime],'-')   AS HotelCheckOutTime,
    ISNULL(b.[CountryName],'-')         AS HotelCountry,
    ISNULL(c.PropertyDescription,'-')   AS HotelDescription,
    KEY_TBL.RANK 

    FROM [EAN].[dbo].[tblactivepropertylist] AS FT_TBL INNER JOIN
     CONTAINSTABLE ([EAN].[dbo].[tblEanFullTextSearch], FullTextSearchColumn, @s)
      AS KEY_TBL
    ON FT_TBL.EANHotelID = KEY_TBL.[KEY]
    INNER JOIN [EAN].[dbo].[tblCountrylist] b
    ON FT_TBL.Country = b.CountryCode
    INNER JOIN [EAN].[dbo].[tblPropertyDescriptionList] c
    ON FT_TBL.[EANHotelID] = c.EANHotelID

위 코드에서[EAN].[dbo].[tblEanFullTextSearch],FullTextSearchColumn 은 새로운 테이블은 열과 함께 필드를 추가,당신은 지금 이렇게 할 수 있는 쿼리에 새로운 테이블과 함께 조인할 테이블에서 데이터를 표시합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top