特殊文字とワイルドカード
(The bot translated the original post https://lists.apache.org/thread/331l0602zcmh5f51nso19l0ltynb98dc into Japanese and reposted it under Apache License 2.0. The copyright of posted content is held by the original poster.)
皆さん、こんにちは。
ドキュメントのフィールドに特殊文字(例:"-"、"@"、"/" など)を含むものがあります。このフィールドで検索を行う際に、奇妙な挙動に遭遇しました。皆さんの助けをいただけると幸いです。
次のようなドキュメントがあるとします:
{
"id":"id_number",
"content":"Hello World-Wide-Web"
}
この場合、content
フィールド内で部分文字列を検索したいと考えています。ユーザーが「Hello World-Wide-Web」と入力したときに、そのドキュメントが見つかることを期待しますが、これは問題なく動作します。
通常であれば、このフィールドに string
型を使用することができます。しかし、典型的なユーザーは文字列全体を入力せずにドキュメントを見つけたいと思うことが多く、また大文字と小文字を区別しない検索を希望しています。
- ここで注意点として、実際に記述されたクエリは必ずしもユーザーが入力したクエリではなく、生成されたクエリであることを理解してください。
そのため、string
型ではなく text
型を使用しています。これによりフィールドがトークン化されます。トークンは "Hello"、"World"、"Wide"、"Web" となり、ユーザーが "woRLd hELlo" と検索しても、トークンは順不同かつ大文字小文字を無視して見つかります。
これ自体はかなり良い動作ですが、私たちの場合、さらに不完全な検索でもドキュメントを見つけられるようにしたいと考えています。そのためにワイルドカード "*" を使用するのが良い方法だと考えました。
通常、ワイルドカードは問題なく動作します:
"content":(Hello wor*)
ユーザーが "hello wor" と入力すると、文章を終える前にドキュメントが見つかります。
しかし、今度はユーザーが「world-wide」と検索した場合です。
"content":world-wide
これはもちろんドキュメントを見つけます。しかし、ユーザーが2単語目を入力し終わる前に、ドキュメントが見つかることも期待されます。
ところが、
"content":world-wid*
は動作しません。私たちの仮定では、検索クエリはインデックス作成時に使用されたのと同じトークナイザーを使うはずです(だから "world-wide" が "world wide" と同じように動作します)。しかし、ワイルドカードを使った瞬間にこの仮定が崩れます。なぜかSolrはクエリのトークン化を行うことができなくなります。
もちろん、全ての特殊文字をスペースに置き換えることもできますが、それでは...
何が間違っているのでしょうか?特殊文字とワイルドカードを使用する際に考慮すべき点があるのでしょうか?
よろしくお願いします。
Dario Viva
トピックへ返信するには、ログインが必要です。