1

数ヶ月前、私はここで同様の質問をしました。しかし、私はそれを正しく動作させることができません:

簡単なファイル名検索を作成しようとしています。ユーザーがファイル名の任意の部分を検索できるようにしたいと思います。
次のファイル名にインデックスが付けられているとします。

[1] My_file_2012.01.12.txt
[2] My_file_2012.01.05.txt
[3] My_file_2012.05.01.txt
[4] My_file_2012.08.27.txt
[5] My_file_2012.12.12.txt
[6] My_file_2011.12.12.txt
[7] file_01_2012.09.09.txt

次に、ユーザーは次を検索する可能性があります。

"ile_20"                    (finds the first six documents)
"12.txt"                    (finds 1, 5, 6)
"12" followed by "01"       (finds 1, 2, 3 - NOT 7)
"2012" followed by "01"     (finds 1, 2, 3 - NOT 7)

(注:はい、ユーザーは実際に「ile_20」のような文字列を検索する可能性があります...たとえば、コピーアンドペーストの間違いが原因です)

したがって、nGram-tokenizerを使用して、ファイル名の各部分にインデックスを付けます。これは今のところうまく機能します。上記の「フォローされた」検索をサポートするには、これら2つの用語の間にテキストがいくつあっても(最大100文字としましょう)、用語の順序を尊重するクエリが必要です。

「slop」を使用した「text_phrase」クエリは用語の順序を正しく尊重しないため、「span_near」クエリを使用することにしました。ほとんどの場合、これは正常に機能します。

ここに私の完全な例を参照してください-インデックスを含む。エラーの説明:クリック

上記の例で述べたように、nGramトークナイザーは各トークンの位置値を生成するため、クエリ「 '2012'の後に'01'」は機能しませんが、これらの値は「span_near」クエリで使用する場合はあまり役に立ちません。索引付け中に、用語「2012」は、用語「01」の位置値(たとえば、10)よりも大きい位置値(50)に割り当てられます。50と10は順番に並んでいないため、クエリの結果は得られません。順序どおりに機能するのは、同じ長さの用語( "'12'の後に'01'"など)または用語が長さの順になっている場合( "'20'の後に'.12'"など)のみです。 )。

では、どうすれば正しい検索動作を実現できますか?用語の順序を尊重しながら、ファイル名の任意の部分を検索できるようにしたいだけです。
たぶん、「span_near」に位置を使用せず、代わりに「start_offset」を使用するように指示する方法がありますか?または、使用できる別のクエリはありますか?

4

1 に答える 1

0

このようなワイルドカード検索はどうですか?

「12」の後に「01」が続く->12* 01

于 2012-09-06T01:08:08.640 に答える