1

field-value-query与搜索一起使用时,我得到了错误的结果'unfiltered'

我将用下面给出的示例数据来解释问题。

XML:

<book>
    <name>Dixit</name>
    <age>25</age>
    <entry>
        <isbn>
            <type>hbk</type>
            <value>1234567</value>
        </isbn>
        <isbn>
            <type>pbk</type>
            <value>111111</value>
        </isbn>
    </entry>
    <entry>
        <isbn>
            <type>hbk</type>
            <value>1234567</value>
        </isbn>
        <isbn>
            <type>pbk</type>
            <value>222222</value>
        </isbn>
    </entry>
</book>

以上xml可以有多个<entry>元素。但是两个或更多<entry>不能有相同<type>的。

我希望所有条目都具有一种或多种isbn类型、值的组合。

如上例所示。我想要<entry>两者兼得hbk:1234567 AND pbk:111111

为了实现这一点,我正在运行以下cts:query

cts:search(
  fn:doc()/book//entry,
  cts:and-query((
    cts:field-value-query("hbk", "1234567", ("case-insensitive")),
    cts:field-value-query("pbk", "222222", ("case-insensitive"))
  )),
  "unfiltered"
)

输出:

<entry>
    <isbn>
        <type>hbk</type>
        <value>1234567</value>
    </isbn>
    <isbn>
        <type>pbk</type>
        <value>111111</value>
    </isbn>
</entry>

据我说,上面的输出是错误的,因为它应该在下面返回<entry>

<entry>
    <isbn>
        <type>hbk</type>
        <value>1234567</value>
    </isbn>
    <isbn>
        <type>pbk</type>
        <value>222222</value>
    </isbn>
</entry>

即使我只使用field-value-query下面给出的一个运行 cts 查询,也会得到相同的结果(pbk值为111111的条目)

cts:search(
  fn:doc()/book//entry,
    cts:field-value-query("pbk", "222222", ("case-insensitive")),
  "unfiltered"
)

我创建的字段:

pbk : /book/entry/isbn[./type = 'pbk']/value

hbk : /book/entry/isbn[./type = 'hbk']/value

索引设置:(两个字段相同)

在此处输入图像描述

注意:对于过滤搜索,它工作正常。

请帮助我理解为什么会出现这种意外行为以及我可以做些什么来纠正它。

试过:

cts:search(
  fn:doc()/book//entry,
  cts:element-query(
    fn:QName('','isbn'),
    cts:and-query((
      cts:field-value-query("hbk", "1234567", ("case-insensitive")),
      cts:field-value-query("pbk", "222222", ("case-insensitive"))
    ))
  ),
  "unfiltered"
)
4

2 回答 2

1

在您的 isbn 元素上使用 cts:element-query() 包装您的 cts:and-query。以下是我的意思的近似值:

cts:search(
  fn:doc()/book//entry,
  cts:element-query(xs:QName("isbn"), 
      cts:and-query((
        cts:element-value-query(xs:QName("hbk"), "1234567", ("case-insensitive")),
        cts:element-value-query(xs:QName("pbk"), "222222", ("case-insensitive"))
      ))
   ),
  "unfiltered"
) 
于 2017-03-28T15:01:04.467 回答
0

未过滤返回匹配的片段中的第一个元素。要获得所需的结果,您需要使用过滤结果或重新建模数据或使用片段根。反转元素的顺序,您会看到 - 它始终是返回的可搜索表达式中的第一个元素。这就是片段和过滤与未过滤的本质。

于 2017-03-28T15:25:47.853 回答