0

Keyword Analyzer ベースの Lucene.NET インデックスを SQL Server 2008 R2 ベースのインデックスに置き換えようとしています。

クエリを実行する必要があるカスタム インデックス フィールドを含むテーブルがあります。インデックス列の値 (以下を参照) は、一連の .NET タイプからのカスタム インデックス フィールドの名前と値のペアの組み合わせです。構造が不明なため、実際の値は実行時に属性から取得されます。

AND と OR を使用してセット名と値のペアを検索し、クエリが一致する行を返すことができる必要があります。

Id          Index
====================================================================
1           [Descriptor.Type]=[5][Descriptor.Url]=[/]
2           [Descriptor.Type]=[23][Descriptor.Url]=[/test]
3           [Descriptor.Type]=[25][Descriptor.Alternative]=[hello]
4           [Descriptor.Type]=[26][Descriptor.Alternative]=[hello][Descriptor.FriendlyName]=[this is a test]

簡単なクエリは次のようになります。

select * from Indices where contains ([Index], '[Descriptor.Url]=[/]');

そのクエリは、次のエラーになります。

Msg 7630, Level 15, State 2, Line 1
Syntax error near '[' in the full-text search condition '[Descriptor.Url]=[/]'.

そのことを念頭に置いて、Index列のデータをand|の代わりに使用するように変更しました。[]

select * from Indices where contains ([Index], '|Descriptor.Url|=|/|');

現在、そのクエリは有効ですが、実行すると、完全に一致するレコード (この場合は正確に 1 つ) ではなく、次を含むすべての行が返されますDescriptor.Url/

私の質問は、クエリをエスケープして[andを考慮し、正確に一致する行]だけが返されるようにするにはどうすればよいですか?

より複雑なクエリは次のようになります。

select * from Indices where contains ([Index], '[Descriptor.Type]=[12] AND ([Descriptor.Url]=[/] OR [Descriptor.Url]=[/test])');

ありがとう、
キーロン

4

2 に答える 2

1

あなたの主な問題は、SQL ワードブレーカーと CONTAINS 構文を使用することです。デフォルトでは、SQL ワード ブレーカーは句読点を削除し、数字、日付、URL、電子メール アドレスなどを正規化します。また、すべてを小文字にし、単語を語幹化します。

したがって、入力文字列の場合:

[Descriptor.Type]=[5][Descriptor.Url]=[/]

次のトークンがインデックスに追加されます(その位置とともに)

記述子タイプ nn5 5 記述子 URL

(注: nn5 は、異なる形式で指定された数値と日付のクエリを簡素化する方法です。元の数値も同じ位置にインデックスが付けられます)

ご覧のとおり、句読点は全文索引にも格納されていないため、CONTAINS ステートメントを使用してクエリを実行する方法はありません。

だからあなたの声明:

select * from Indices where contains ([Index], '|Descriptor.Url|=|/|'); 

実際には、全文インデックスに送信する前に、クエリ ジェネレーターによって「記述子 url」に正規化されるため、「url」の隣に「記述子」が含まれるすべてのエントリ (句読点を除く) にヒットします。

必要なのはLIKE ステートメントです。

于 2011-02-15T19:03:23.147 に答える
0

「|」の使用 区切り文字により、contains クエリが OR と見なされるためです。そのため、予期しない結果が得られます。次のようにブラケットをエスケープできるはずです。

SELECT * FROM Indices WHERE 
    contains ([Index], '[[]Descriptor.Type]=[[]12]') 
于 2011-02-09T18:08:39.950 に答える