문제

저는 현재 SQL-Server 데이터베이스가 있는 응용 프로그램을 작업 중이며 사람의 이름을 검색할 수 있는 전체 텍스트 검색이 필요합니다.

현재 사용자는 3개의 다른 varchar 열을 검색하는 이름 필드에 a를 입력할 수 있습니다.이름, 성, 중간 이름

다음 정보가 포함된 3개의 행이 있다고 가정해 보겠습니다.

1 - 필립 - J - 프라이

2 - 에이미 - NULL - 웡

3 - 레오 - NULL - 웡

사용자가 'Fry'와 같은 이름을 입력하면 행 1이 반환됩니다.하지만 Phillip Fry, Fr, Phil을 입력하면 아무것도 얻지 못합니다.왜 이런 짓을 하는지 이해가 안 돼요.Wong을 검색하면 Amy Wong을 검색하면 행 2와 3이 표시되고 다시는 아무것도 표시되지 않습니다.

현재 쿼리는 CONTAINSTABLE을 사용하고 있지만 결과에 눈에 띄는 차이 없이 FREETEXTTABLE, CONTAINS 및 FREETEXT로 전환했습니다.테이블 방법은 동일한 결과를 반환하지만 순위를 지정하므로 선호됩니다.

여기에 쿼리가 있습니다.

....
@Name nvarchar(100),
....
--""s added to prevent crash if searching on more then one word.
DECLARE @SearchString varchar(100)
SET @SearchString = '"'+@Name+'"'
SELECT Per.Lastname, Per.Firstname, Per.MiddleName
FROM Person as Per
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 
AS KEYTBL
ON Per.Person_ID = KEYTBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEYTBL.RANK DESC;  
....

어떤 아이디어...?이 전체 텍스트 검색이 올바르게 작동하지 않는 이유는 무엇입니까?

도움이 되었습니까?

해결책 3

답변 감사드립니다. 드디어 작동하게 되었습니다.Biri와 Kibbee의 답변 중 일부입니다.작동하려면 문자열에 *를 추가하고 공백으로 나누어야 했습니다.그래서 결국 나는 얻었습니다.

....
@Name nvarchar(100),
....
--""s added to prevent crash if searching on more then one word.
DECLARE @SearchString varchar(100)

--Added this line
SET @SearchString = REPLACE(@Name, ' ', '*" OR "*')
SET @SearchString = '"*'+@SearchString+'*"'

SELECT Per.Lastname, Per.Firstname, Per.MiddleName
FROM Person as Per
INNER JOIN CONTAINSTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 
AS KEYTBL
ON Per.Person_ID = KEYTBL.[KEY]
WHERE KEY_TBL.RANK > 2
ORDER BY KEYTBL.RANK DESC;  
....

더 많은 필드를 검색하고 있습니다. 질문에 대해 단순화했을 뿐입니다. 죄송합니다. 답변에 영향을 미칠 것이라고는 생각하지 못했습니다.실제로 닉네임 csv와 메모 열이 있는 열을 검색합니다.

도와 주셔서 감사합니다.

다른 팁

FreeTextTable이 작동해야 합니다.

INNER JOIN FREETEXTTABLE(Person, (LastName, Firstname, MiddleName), @SearchString) 

@SearchString은 'Phillip Fry'(공백으로 구분된 모든 조회 문자열을 포함하는 하나의 긴 문자열)와 같은 값을 포함해야 합니다.

Fr 또는 Phil을 검색하려면 별표를 사용해야 합니다.Phil*과 Fr*

'Phil'은 정확히 'Phil'이라는 단어를 찾고 있습니다.'Phil*'은 'Phil'로 시작하는 모든 단어를 찾습니다.

사람 이름만 검색하는 경우에는 전체 텍스트 색인도 사용하지 않는 것이 가장 좋습니다.전체 텍스트 인덱스는 큰 텍스트 필드가 있는 경우 의미가 있지만 필드당 하나의 단어를 주로 처리하는 경우 전체 텍스트 인덱스에서 얼마나 많은 추가 혜택을 얻을 수 있는지 잘 모르겠습니다.새 레코드를 검색하기 전에 전체 텍스트 색인이 자체적으로 다시 색인화될 때까지 기다리는 것은 많은 문제 중 하나일 수 있습니다.

다음과 같은 쿼리를 만들 수도 있습니다.검색 문자열을 공백으로 분할하고 검색어 목록을 만듭니다.

Select FirstName,MiddleName,LastName 
From person 
WHERE 
Firstname like @searchterm1 + '%'
or MiddleName like @searchterm1 + '%'
or LastName like @searchterm1 + '%'
or Firstname like @searchterm2 + '%'
etc....

또 다른 접근 방식은 개별 필드에서 검색을 추상화하는 것입니다.

즉, 이름 성과 같은 모든 분할 필드를 연결된 필드로 바꾸는 데이터 뷰를 만듭니다.성명

그런 다음 보기를 검색합니다.이렇게 하면 검색 쿼리가 더 간단해질 수 있습니다.

확인해 보세요. Lucene.net 전체 텍스트의 대안으로.

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