1

まず、私は 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 はまだハイフンを取り、必要な結果を省略しています。

4

2 に答える 2

2

Luceneが「sophie-allen」を2つのトークンに分割するのは正しいですが、それらのトークンは隣接しています。次のようなフレーズ表現を試したとのことですが、

... jcr:contains(*/*/*,'"sophie-a*"') ...

これは、トークン「sophie」の後に、最初の文字として「a」を含む別のトークンを見つけることで機能するはずです。このフレーズ式をトークン化するには、インデックス作成中に使用したものと同じアナライザーを使用する必要があるため、「-」文字は引き続き区切り文字として使用されます[1]。(JavaコードでXPath式を指定する場合は、前に円記号を付けて二重引用符をエスケープする必要があることに注意してください。)

ただし、これが機能しない場合は、この式のハイフンを削除してみてください。ワイルドカードを使用しているため、ロジックがワイルドカード式を誤ってトークン化している可能性があります。言い換えれば、次のことを試してください。

... jcr:contains(*/*/*,'"sophie a*"') ...

もちろん、ワイルドカードがなければ、これはおそらく機能します(ハイフンの有無にかかわらず):

... jcr:contains(*/*/*,'"sophie-allen"') ...

幸運を!

PSこれがJackrabbitで機能することは確認していませんが、ModeShape(Luceneも使用)では機能します。

[1]正確なルールはトークナイザーによって異なります。たとえば、StandardTokenizerは英語のストップワードを除外しますが、トークンに数字がある場合を除いて、「-」文字をトークン化します(この場合、トークン全体が積として解釈され、分割されません。

于 2010-08-26T13:58:51.080 に答える
1

同僚とこれに取り組んでいるときに、ModeShape のこのJIRAを発見しました。これは、Randall によって偶然にログに記録されました (彼もここで回答しました)。この問題は、jackrabbit がワイルドカードを含む検索語でワイルドカードを適切に/うまく処理していないことが原因であることが判明しました。

Randall は ModeShape の修正を行いましたが、私の同僚とプロジェクト チームは、Jackrabbit の使用が 100% 確実ではないため、この段階では問題を修正しないことを提案しました。

この質問への回答を Randall に関連付けたいと思いますが、彼の投稿は実際の回答ではありません。Randall が来て何かを投稿しない限り、この投稿を回答としてマークします。

于 2010-11-24T23:18:55.463 に答える