2013-03-04 2 views
1

시스템 목록을 기반으로 중지 목록을 만들었으며이를 사용하기 위해 전체 텍스트 색인을 설정했습니다.SQL Server 2008 - 스톱 워드에서 전체 텍스트 검색이 중지되지 않음

코드 select unique_index_id, stoplist_id from sys.fulltext_indexes을 실행하면 모든 색인이 내가 만든 하나의 ID 5와 함께 중지 목록을 사용하고있는 것을 볼 수 있습니다.

FTS_PARTIAL을 사용하여 텍스트를 실행할 때 결과가 정확합니다. 예 :

SELECT special_term, display_term 
FROM sys.dm_fts_parser 
(' "Rua José do Patrocinio nº125, Vila América, Santo André - SP" ', 1046, 5, 0) 

I가 중지 목록에 추가 단어가 노이즈 단어로 나타낸다. 하지만 내 질문을 실행할 때 어떤 이유로 나는 stopwords를 포함하는 레지스터도 가져온다. 예를 들어

:

SELECT * 
FROM tbEndereco 
WHERE CONTAINS (*, '"rua*" or "jose*"') 

나에게 내가 기대하는 것처럼 위의 레지스터를 가져옵니다. 'rua'라는 단어는 무시되어야하지만 'Jose'는 일치해야합니다.

하지만 검색하는 경우 : 내가 더 레지스터가 발견되지 기대

SELECT * 
FROM tbEndereco 
WHERE CONTAINS (*, '"rua*"') 

. 'rua'는 정지 단어로 설정되기 때문에.

나는 stoplist 언어로 브라질 (포르투갈)을 사용하고 있습니다. "Rua"라는 단어 (즉 "Street"을 의미)는 무시해야합니다 (내가 중지 목록에 추가 한 것처럼). 그것은 파서에 의해 잡음으로 인식되지만 쿼리를 실행하면 "Rua"가 포함 된 레지스터가 나타납니다.

내 검색은 주소 검색이므로 "거리", "애비뉴"등의 단어는 무시해야합니다. (물론 포르투갈어로도 모두 추가했습니다.)

이것은 테이블을 조회 할 때 사용하는 쿼리입니다.

select DISTINCT(PES.idPessoa) 
, PES.Nome     
, EN.idEndereco 
, EN.idUF  
, CID.Nome as Cidade 
, EN.Bairro  
, EN.Logradouro 
, EN.Numero 
, EN.Complemento 
, EN.CEP 
, EN.Lat 
, EN.Lng  
from tbPessoa PES 
INNER JOIN tbAdvogado ADV ON PES.idPessoa = ADV.idPessoa 
INNER JOIN tbEndereco EN ON PES.idEmpresa = EN.idEmpresa 
LEFT JOIN tbCidade CID ON CID.idCidade = EN.idCidade 
where adv.Ativo = 1 
and CONTAINS (en.*, '"rua*"') 
OR EN.idCidade IN (SELECT idCidade 
       FROM tbCidade 
       WHERE CONTAINS (*, '"rua*"')) 
OR PES.idPessoa IN (SELECT DISTINCT (ADVC.idPessoa) 
       FROM tbComarca C 
       INNER JOIN tbAdvogadoComarca ADVC 
            ON ADVC.idComarca = C.idComarca 
       WHERE CONTAINS (Nome, '"rua*"')) 
OR PES.idPessoa IN (SELECT OAB.idPessoa 
       FROM tbAdvogadoOAB OAB 
       WHERE CONTAINS (NROAB, '"rua*"')) 

나는 FREETEXT와 CONTAINS 모두 시도했다. WHERE CONTAINS (NROAB, 'rua'))과 같은 간단한 것을 사용하면 "루아"를 포함하는 레지스터도 가져옵니다.

내 쿼리가 약간의 문제가있을 수 있다고 생각하고 간단한 쿼리를 시도하고 나에게 "Rua"라는 스톱 워드를 가져 왔습니다.

SELECT * 
FROM tbEndereco 
WHERE CONTAINS (*, 'rua') 

내가 알아챈 한 가지는 시스템 중지 목록에서 나온 원래 단어가 정상적으로 작동한다는 것입니다. 예를 들어, "do"("of"를 의미하는) 단어를 사용하면 어떤 레지스터도 가져 오지 않습니다.

예 : 그 문제이고 아무것도 없어 여부를 확인하기 위해 모든 테이블에서 SSMS를 통해 "전체 채우기 시작"명령을 실행하려고

SELECT * 
FROM tbEndereco 
WHERE CONTAINS (*, '"do*"') 

.

여기에 무엇이 누락 되었습니까? Fulltext 인덱스로 작업하는 것은 이번이 처음이며 일부 설정이 누락되었을 수 있습니다.

미리 도움을 주셔서 감사합니다.

감사합니다.

세자르.

+0

@Rafael Colucci에게 감사드립니다. 귀하의 답변을 읽은 후에 제 질문을 편집했는데 그 이유는 결과표에서 정지 단어가 제거 될 것이라고 생각한 이유를 알 수 있었기 때문입니다. 나는 정말로 그것을 기록했기 때문에. =) 고마워. –

답변

1

질문을 변경 했으므로 답변을 변경하고 조금 더 자세히 설명하려고합니다. Stopwords and Stoplists에 따르면

: 불용어가 특정 언어로 의미있는 단어가 될 수

, 또는 는 언어 적 의미가없는 토큰이 될 수 있습니다. 예를 들어 영어에서 "a", "and", "is"및 "the"는 검색에 쓸모 없기 때문에 전체 텍스트 색인에서 제외 된 입니다.

불용어가 포함되지는 않지만 전체 텍스트 색인 은 해당 위치를 고려합니다. 예를 들어, "이 Adventure Works Cycles 지침은 모델에 적용됩니다"라는 문구를 고려하십시오. 내가 왜 확실하지 않다

,하지만 난 같은 phrasal 검색을 사용하는 경우에만 적용 생각 : 다음 표는 문구에서 단어의 위치를 ​​보여이 같은 라인이있는 경우

을 :

Teste anything casa 

그리고 당신은 전체 텍스트를 조회 :

SELECT * 
FROM Address 
WHERE CONTAINS (*, '"teste rua casa"') 

라인 :

Teste anything casa 

반송됩니다. 이 경우, 전체 텍스트는 다음과 같이 귀하의 쿼리를 변환합니다 :

"Search for 'teste' near any word near 'casa'" 

을 당신이 "또는"연산자를 사용하거나에만 규칙이 적용되지 않는 하나 개의 단어를 검색 전체 텍스트를 쿼리합니다. 나는 그것을 약 3 개월 동안 여러 번 시험해 보았고 그 이유를 이해하지 못했습니다.

편집

당신은 라인

"Rua José do Patrocinio nº125" 

을 가지고 있고 당신은 단어 중 하나 이상을 포함 않기 때문에이 선을 가져올 것이다

"WHERE CONTAINS (, '"RUA" or "Jose*" or "do*"')" 

전체 텍스트를 조회 할 경우 "rua"와 "do"라는 단어가 무시되고 있기 때문에 검색하고 있습니다.

+0

글쎄, 나는 스톱 어 구어가 검색에서 한 단어를 무시할 것이라고 생각했다. 예를 들어 나는 불법 단어가 이런 식으로 작동 할 것으로 기대합니다. "Rua José do Patrocinio nº125"구문을 사용하여 검색 할 경우 : "내 쿼리를 탑재하는 방법은 (*, '"RUA * "또는"Jose * "또는"do * "') C#, 2 단어 "rua"와 "do"가 무시 될 수 있기 때문에 위의 레지스터를 가져 오지만 검색은 "Jose"와 일치합니다. 그러나 "WHERE CONTAINS (*, '"RUA * "또는"do * "')"를 검색했다면. 내가 찾는 단어가 무시되기 때문에 아무 것도 가져올 수 없습니다. 나는 그것이 실제로 어떻게 작동하는지 모르겠다. –

+0

그것이 내가해야한다고 생각하는 것입니다. 그러나 그것은 일어나지 않습니다. 우리는 이것에 많은 시간을 할애하여 검색 쿼리를 생성 할 때 불용어를 무시하는 알고리즘을 만들기로 결정했습니다. –

+0

시스템에서 제공하는 정지 단어에 대해 작동해야하는 방식이 무엇인가하는 점이 무엇입니까? 내가 추가 한 것들만 제대로 작동하지 않습니다. : S –

관련 문제