首先,我只想说我对 JSR-170 和 Jackrabbit/Lucene 很陌生。
我有以下 XPath 查询:
//*[@sling:resourceType="users/user-profile" and jcr:contains(*/*/*,'sophie\-a')] order by @jcr:score descending
我有一个名为 Sophie-Allen 的用户和一个名为 Sophie-Anne 的用户。使用上述查询搜索返回零结果,其中单独搜索“sophie”返回两个用户。我知道连字符在 JSR-170 中意味着排除,但我已经逃脱了它(如您在上面看到的)。
为什么这个查询没有返回两个用户?
另一个奇怪的事情是当我使用星号时(连字符在执行时都被转义了):
- 搜索
'sophie-allen'
返回 Sophie-Allen 的记录。 - 搜索
'soph*'
返回 Sophie-Allen 和 Sophie-Anne。 - 搜索
'sophie-a*
什么也不返回。 - 搜索
'sophie-allen*'
什么也不返回。
我知道使用 jcr:contains,从技术上讲,您不需要使用星号,但看看上述行为,它似乎有某种效果。
关于 XPath 查询和搜索 JCR 中的连字符和星号,我还有什么遗漏吗?我已经搜索了我能想到的所有内容并通读了规范,但似乎找不到任何可以回答我问题的内容。
提前致谢。
编辑: 看起来“短语查询”不适用于 jcr:contains(不再?),因为默认的 Lucene 分析器在连字符上标记,这意味着它将“sophie-allen”拆分为 sophie 和 allen。
编辑 2: 我尝试使用 Jackrabbit 用户列表中某人建议的自定义分析器和标记器,但这也没有帮助,Lucene 仍在使用连字符并省略我想要的结果。