시스템 목록을 기반으로 중지 목록을 만들었으며이를 사용하기 위해 전체 텍스트 색인을 설정했습니다.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 인덱스로 작업하는 것은 이번이 처음이며 일부 설정이 누락되었을 수 있습니다.
미리 도움을 주셔서 감사합니다.
감사합니다.
세자르.
@Rafael Colucci에게 감사드립니다. 귀하의 답변을 읽은 후에 제 질문을 편집했는데 그 이유는 결과표에서 정지 단어가 제거 될 것이라고 생각한 이유를 알 수 있었기 때문입니다. 나는 정말로 그것을 기록했기 때문에. =) 고마워. –