6

次の表にフリー テキスト検索を追加しました。

| 1 | kayer-meyar | 
| 2 | KA-ME |

しかし、

select * 
from Names 
where CONTAINS(name, '"ME*"')

のみを返します:

| 1 | kayer-meyar |

その間、

select * 
from Names 
where CONTAINS(name, '"KA*"')

両方を返します:

| 1 | kayer-meyar |
| 2 | KA-ME |

実行すると:

select * 
from sys.dm_fts_parser('"KA-ME"', 1033, NULL, 0)

戻り値:

ka-me
ka
me
4

3 に答える 3

3

問題を検索して調整した後、全文検索で 2 つの大きな問題を発見しました。

  1. ハイフンは単語の区切りとして扱われる場合があります。使用時のみ戻り| 1 | kayer-meyar |ます'"ME*"'。戻りません| 2 | KA-ME |end with問題は、条件が (not or in a middle)で始まる単語のみを許可するためME + at least one characterです。「では、文字列がこの単語の途中にあるのに、どうして戻ってくる のですか?」と言うことができます。. それは、全文検索がそれを単一の単語と見なさず、2 つの別個の単語 ( のようなもの)と見なして、要件 ( ) を満たしているからです。繰り返しますが、単一の単語ではなく認識し、条件も失敗します(スターが付いていますが、その後に余分な文字はありません)| 1 | kayer-meyar |mekayer meyarme*KA-MEKA MEME
  2. フルテキスト インデックスの再構築を試みましたか? .

現在の解決策は次 のとおりです。全文検索クエリのストップリストをオフにしました これにはこのクエリを使用します(私のテーブル名は ですMyTable):

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF

次に、クエリを実行します。今度はあなたの望みの結果が得られます。 ここに画像の説明を入力

そして、ここに私の完全なクエリがあります:

--CREATE TABLE MyTable
--(
--Id INT IDENTITY(1,1),
--Name varchar(max)  Not Null
--)

---- To see if FULLTEXT installed or not
--SELECT SERVERPROPERTY('IsFullTextInstalled')

---- http://stackoverflow.com/questions/2306825/why-cant-i-create-this-sql-server-full-text-index
---- https://technet.microsoft.com/en-us/library/ms187317.aspx
---- http://stackoverflow.com/questions/2306825/why-cant-i-create-this-sql-server-full-text-index
---- http://stackoverflow.com/questions/2315577/sql-server-2008-full-text-search-on-a-table-with-a-composite-primary-key

--CREATE UNIQUE INDEX ui_MyTable ON MyTable(Id); 
--select name from sysindexes where object_id('MyTable') = id;

--CREATE FULLTEXT CATALOG ft AS DEFAULT; 

--CREATE FULLTEXT INDEX ON MyTable(Name)   
--   KEY INDEX ui_MyTable  
--   WITH STOPLIST = SYSTEM;  
--GO  

--INSERT INTO MyTable(Name) VALUES('kayer-meyar'),('KA-ME');


ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF

select * 
from MyTable 
where CONTAINS(Name, '"ME*"')

select *
from MyTable 
where CONTAINS(Name, '"KA*"')
于 2016-07-06T04:13:23.053 に答える
2

あなたが説明した動作は、システム ストップワード リストの使用が正しい結果です。これは予期される動作です。「Me」は、システムのストップワード リストにあるストップ ワードです。データ インデックス作成プロセスでデフォルトで使用されるシステム ストップワード リスト。

このスクリプトで自分自身をチェックできます。

select * from sys.dm_fts_parser('"KA-ME"', 1033, 0, 0)

ここでの 3 番目のパラメータは、ストップワード リストの識別子です。NULL を渡すと、解析時にストップワードが識別されず、「完全一致」タイプの「ME」が表示されます。3 番目のパラメータとして 0 を渡すと、システム ストップワード リストが使用され、「ME」は「ノイズ ワード」タイプになります。これは、SQL Server がそれを検索用の FTS インデックスに保存しないことを意味します。

Raihan が述べたように、システム ストップワード リストをオフにすることはできますが、私にとっては、ストップワードを完全にオフにすることは、特に Azure SQL Database の場合、大きすぎるハンマーです。内部テーブル)。新しい (より小さな) ストップワード リストを作成し、それを FTS に使用することは、より良い解決策かもしれません。

于 2016-07-06T11:39:22.030 に答える
0

クエリを実行してみてください: select * from sys.dm_fts_parser('" kayer-meyar"', 1033, NULL, 0)

ME は Kayer-meyar の単語ではなく、結果が得られない場合があります。

于 2016-06-28T21:20:51.537 に答える