字段值查询在与未经过滤的'一起使用时返回意外结果在MarkLogic中搜索

时间:2017-03-28 13:32:15

标签: marklogic marklogic-8 cts-search

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

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

enter image description here

注意:对于过滤搜索,它运行正常。

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

尝试:

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"
)

2 个答案:

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