まず、私は JSR-170 と Jackrabbit/Lucene 全般について非常に初心者です。
次の XPath クエリがあります。
//*[@sling:resourceType="users/user-profile" and jcr:contains(*/*/*,'sophie\-a')] order by @jcr:score descending
Sophie-Allen という名前のユーザーと Sophie-Anne という名前のユーザーがいます。上記のクエリを使用して検索すると、0 件の結果が返されます。「sophie」だけを検索すると、両方のユーザーが返されます。JSR-170 ではハイフンが除外を意味することは理解していますが、エスケープしました (上記を参照)。
このクエリが両方のユーザーを返さないのはなぜですか?
もう1つの奇妙なことは、アスタリスクを使用する場合です(実行時にハイフンはすべてエスケープされます):
'sophie-allen'
返されたソフィー・アレンのレコードを検索しています。'soph*'
Sophie-Allen と Sophie-Anne の両方が返されます。- を検索して
'sophie-a*
も何も返されません。 - を検索して
'sophie-allen*'
も何も返されません。
jcr:contains では、技術的にはアスタリスクを使用する必要がないことは理解していますが、上記の動作を見ると、何らかの効果があるようです。
XPath クエリおよび JCR の検索でのハイフンとアスタリスクに関して、私が見逃しているものは他にありますか? 仕様を考えて読むことができるすべてのものをグーグル検索しましたが、私の質問に答えるものを見つけることができないようです.
前もって感謝します。
編集: デフォルトの Lucene Analyzer はハイフンでトークン化するため、「フレーズ クエリ」は jcr:contains (もう?) では機能しないようです。つまり、「sophie-allen」を sophie と allen に分割します。
編集 2: Jackrabbit ユーザー リストの誰かが提案したように、カスタム アナライザーとトークナイザーを使用してみましたが、それも役に立ちませんでした。Lucene はまだハイフンを取り、必要な結果を省略しています。