Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lucene Jackrabbit XPath查询中的连字符问题_Lucene_Xpath_Jackrabbit_Jcr_Jsr170 - Fatal编程技术网

Lucene Jackrabbit 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

首先,我要说的是,我对JSR-170和Jackrabbit/Lucene一般来说都是新手

我有以下XPath查询:

//*[@sling:resourceType="users/user-profile" and jcr:contains(*/*/*,'sophie\-a')] order by @jcr:score descending
我有一个叫索菲·艾伦的用户和一个叫索菲·安妮的用户。使用上述查询进行搜索将返回零结果,其中单独搜索“sophie”将返回两个用户。我理解连字符在JSR-170中的意思是排除,但我已经跳过了它(正如您在上面看到的)

为什么此查询不同时返回两个用户

另一件奇怪的事情是当我使用星号时(执行时连字符都转义):

  • 搜索
    “sophie-allen”
    将返回sophie allen的记录
  • 搜索
    “soph*”
    将返回Sophie Allen和Sophie Anne
  • 搜索sophie-a*将不返回任何内容
  • 搜索
    “sophie-allen*”
    不会返回任何结果
我理解jcr:contains在技术上不需要使用星号,但是从上面的行为来看,它似乎有某种效果

关于XPath查询和搜索JCR中的连字符和星号,我还缺少什么吗?我已经在谷歌上搜索了我能想到的所有东西,并通读了规范,但似乎找不到任何能回答我问题的东西

提前谢谢

编辑: “短语查询”似乎无法与jcr:contains(不再?)一起使用,因为默认的Lucene Analyzer在连字符上标记,这意味着它将“sophie allen”拆分为sophie和allen

编辑2:
我曾尝试使用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"') ...