システムのリストに基づいてストップリストを作成し、それを使用するようにフルテキスト インデックスを設定しました。
コードを実行する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)
ストップリストに追加した単語は、ノイズ ワードとして表示されます。しかし、何らかの理由でクエリを実行すると、ストップワードを含むレジスタも表示されます。
例えば:
SELECT *
FROM tbEndereco
WHERE CONTAINS (*, '"rua*" or "jose*"')
予想どおり、上記のレジスタが表示されます。「rua」という単語は無視する必要があるため、「Jose」は一致します。
しかし、私が検索した場合:
SELECT *
FROM tbEndereco
WHERE CONTAINS (*, '"rua*"')
レジスタが見つからないと思います。「rua」はストップワードに設定されているためです。
ブラジル語 (ポルトガル語) をストップリスト言語として使用しています。そのため、"Rua" (つまり "Street" を意味する) という単語は無視する必要があります (停止リストに追加したため)。パーサーによってノイズとして認識されますが、クエリを実行すると、「Rua」を含むレジスタが表示されます。
私の検索は住所検索なので、「Street」や「Avenue」などの単語は無視する必要があります(もちろんポルトガル語で、すべて追加しました)。
これは、テーブルを検索するために使用しているクエリです。
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」を含むレジスタも表示されます。
クエリに問題がある可能性があると思ったので、より単純なクエリを試してみたところ、ストップワード「Rua」も表示されました。
SELECT *
FROM tbEndereco
WHERE CONTAINS (*, 'rua')
私が気づいたことの 1 つは、システム ストップリストのネイティブな単語が問題なく機能することです。たとえば、"do" ("of" を意味する) という単語を試しても、何のレジスターも表示されません。
例:
SELECT *
FROM tbEndereco
WHERE CONTAINS (*, '"do*"')
すべてのテーブルで SSMS を介して「完全な作成を開始」コマンドを実行して、それが問題であるかどうかを確認しようとしましたが、何も得られませんでした。
ここで何が欠けていますか。フルテキスト インデックスを使用するのはこれが初めてで、設定のポイントが不足している可能性があります。
どうぞよろしくお願いいたします。
よろしく、
セザール。