与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>
即使我运行的cts查询只有一个field-value-query
,如下所示,得到相同的结果(条目 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"
)
答案 0 :(得分: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"
)
答案 1 :(得分:0)
Unfiltered返回匹配的片段中的第一个元素。要获得所需的结果,您需要使用过滤结果或重新建模数据或使用片段根。反转元素的顺序,您将看到 - 它始终是返回的可搜索表达式中的第一个元素。这是片段的本质,过滤与未过滤。