Lucene Jackrabbit XPath查询中的连字符问题
首先,我要说的是,我对JSR-170和Jackrabbit/Lucene一般来说都是新手 我有以下XPath查询:Lucene Jackrabbit XPath查询中的连字符问题,lucene,xpath,jackrabbit,jcr,jsr170,Lucene,Xpath,Jackrabbit,Jcr,Jsr170,首先,我要说的是,我对JSR-170和Jackrabbit/Lucene一般来说都是新手 我有以下XPath查询: //*[@sling:resourceType="users/user-profile" and jcr:contains(*/*/*,'sophie\-a')] order by @jcr:score descending 我有一个叫索菲·艾伦的用户和一个叫索菲·安妮的用户。使用上述查询进行搜索将返回零结果,其中单独搜索“sophie”将返回两个用户。我理解连字符在JSR-17
//*[@sling:resourceType="users/user-profile" and jcr:contains(*/*/*,'sophie\-a')] order by @jcr:score descending
我有一个叫索菲·艾伦的用户和一个叫索菲·安妮的用户。使用上述查询进行搜索将返回零结果,其中单独搜索“sophie”将返回两个用户。我理解连字符在JSR-170中的意思是排除,但我已经跳过了它(正如您在上面看到的)
为什么此查询不同时返回两个用户
另一件奇怪的事情是当我使用星号时(执行时连字符都转义):
- 搜索
将返回sophie allen的记录李>“sophie-allen”
- 搜索
将返回Sophie Allen和Sophie Anne李>“soph*”
- 搜索sophie-a*将不返回任何内容李>
- 搜索
不会返回任何结果“sophie-allen*”
我曾尝试使用Jackrabbit用户列表中的某个人建议的自定义分析器和标记器,但也没有任何帮助,Lucene仍然使用连字符并省略了我想要的结果。你是正确的,Lucene确实将“sophie allen”拆分为两个标记,但这些标记是相邻的。你说你试过这样的短语表达:
... jcr:contains(*/*/*,'"sophie-a*"') ...
这应该通过查找标记“sophie”以及另一个包含“a”作为第一个字符的标记来实现。由于索引期间使用的同一分析器应用于标记此短语表达式,因此“-”字符仍将用作分隔符[1]。(请注意,如果要在Java代码中指定XPath表达式,则必须使用前面的反斜杠转义双引号字符。)
但是,如果这不起作用,可以尝试删除此表达式中的连字符。因为您使用的是通配符,所以逻辑可能错误地标记了通配符表达式。换句话说,尝试:
... jcr:contains(*/*/*,'"sophie a*"') ...
当然,如果没有通配符,这可能会起作用(使用或不使用连字符):
祝你好运
另外,我还没有证实这在Jackrabbit中有效,但它在ModeShape(它也使用Lucene)中有效
[1] 确切的规则取决于标记器。例如,StandardTokenizer过滤掉英语的停止词,但标记“-”字符,除非标记中有数字(在这种情况下,整个标记被解释为产品,而不是拆分)。在与同事一起处理此问题时,我们为ModeShape发现了这一点,Randall附带记录了这一点(谁也回答了这个问题)。原来问题是因为jackrabbit没有正确/太好地处理带有通配符的搜索词中的通配符 Randall已经对ModeShape进行了修复,但我的同事和项目团队建议在现阶段不要修复我们的问题,因为Jackrabbit的使用不是100%确定的
我想把这个问题的答案和Randall联系起来,但是他的帖子不是真正的答案。我会把这个帖子标记为答案,除非Randall出现并发布一些东西。我将把你的标签改为
xpathengines
,因为除了这个问题与jcr:contains
扩展函数有关外,没有ordXPath 1.0或2中的er by
运算符。0@alejandro-np,谢谢。双引号上没有骰子。事实上,jackrabbit没有任何效果(
... jcr:contains(*/*/*,'"sophie-allen"') ...