3

次のクエリ文字列があります。

SELECT jcr:title, jcr:created, jcr:description FROM cq:PageContent WHERE jcr:path LIKE '/content/.../%' AND CONTAINS (., '*') ORDER BY date ASC

問題は、プロパティにアスタリスクがないにもかかわらず、クエリが指定されたパスからすべてのノードを返すことです。アスタリスク文字をエスケープしたかったのですが、結果は同じです。私はこのようなことを試しました:

SELECT jcr:title, jcr:created, jcr:description FROM cq:PageContent WHERE jcr:path LIKE '/content/.../%' AND CONTAINS (., '\*') ORDER BY date ASC

またはこのようなもの:

SELECT jcr:title, jcr:created, jcr:description FROM cq:PageContent WHERE jcr:path LIKE '/content/.../%' AND CONTAINS (., '\*\*\*\*\*\*\*\*\*\*\*') ORDER BY date ASC

これらすべてのクエリで、アスタリスク文字 (または 11 個) を含むプロパティがこれらのページにない場合でも、結果は同じです。

jcr:contains 関数のドキュメントには次のように書かれています。

searchexp リテラル インスタンス内で、一重引用符 ("'")、二重引用符 (""")、およびハイフン ("-") はバックスラッシュ ("\") でエスケープする必要があります。したがって、バックスラッシュ自体もエスケープする必要があり、最終的には二重バックスラッシュ (「\」) として。

のような他の文字*は言及されていないので、エスケープ (?) しなくても機能するはずです。ここでそのような結果が得られる理由と、そのような文字を適切にエスケープする方法を理解してください。

4

3 に答える 3

0

Jackrabbit Wikiページでついに答えを見つけました

fulltext (contains) 節でのテキストのエスケープ

Jackrabbit Oak は、全文検索に Apache Lucene 文法を使用します。そのため、contains で使用するためにユーザーが指定したテキストをエスケープするには、すべての特殊文字を除外するか、エスケープする必要があります。たとえば、特殊文字を除外するには、次を使用します。

String filteredContains = searchTerm.replaceAll("[\\Q+-&|!(){}[]^\"~*?:\\/\\E]", ""); String q = "/jcr:root/foo/element(*, foo)" + "[jcr:contains(@title, '" + filteredContains.replaceAll("'", "''") + "')]" + "[@itemID = '" + itemID.replaceAll("'", "''") + "']";

Jackrabbit 2.x のみ: Text.escapeIllegalXpathSearchChars(...)jcr:contains(...) の呼び出しに使用 (JCR-1248 も参照):

String q = "/jcr:root/foo/element(*, foo)" + "[jcr:contains(@title, '" + Text.escapeIllegalXpathSearchChars(searchTerm).replaceAll("'", "''") + "')]" + "[@itemID = '" + itemID.replaceAll("'", "''") + "']";

于 2018-04-09T09:44:09.193 に答える