1

システムのリストに基づいてストップリストを作成し、それを使用するようにフルテキスト インデックスを設定しました。

コードを実行する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 を介して「完全な作成を開始」コマンドを実行して、それが問題であるかどうかを確認しようとしましたが、何も得られませんでした。

ここで何が欠けていますか。フルテキスト インデックスを使用するのはこれが初めてで、設定のポイントが不足している可能性があります。

どうぞよろしくお願いいたします。

よろしく、

セザール。

4

1 に答える 1

1

質問が変更されたので、回答を変更して、もう少し詳しく説明します。

ストップワードとストップリストによると:

ストップワードは、特定の言語で意味を持つ単語にすることも、言語的な意味を持たないトークンにすることもできます。たとえば、英語では、「a」、「and」、「is」、「the」などの単語は、検索に役に立たないことがわかっているため、フルテキスト インデックスから除外されます。

ストップワードが含まれているかどうかは無視されますが、フルテキスト インデックスではその位置が考慮されます。たとえば、「手順はこれらの Adventure Works Cycles モデルに適用できます」というフレーズを考えてみましょう。次の表は、フレーズ内の単語の位置を示しています。

理由はわかりませんが、次のようなフレーズ検索を使用する場合にのみ適用されると思います。

次のような行がある場合:

Teste anything casa

そして、全文を次のようにクエリします。

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

この線:

Teste anything casa

返されます。その場合、全文はクエリを次のように変換します。

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

「or」演算子を使用して全文をクエリするか、1 つの単語のみを検索する場合、ルールは適用されません。約3か月間、何度かテストしましたが、理由がわかりませんでした。

編集

あなたがラインを持っている場合

"Rua José do Patrocinio nº125" 

そして、あなたは全文を照会します

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

「rua」と「do」という単語が無視されているためではなく、検索している単語の少なくとも1つが含まれているため、行が表示されます。

于 2013-03-04T21:29:02.693 に答える