首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字段值查询在MarkLogic中与“未筛选”搜索一起使用时返回意外结果

字段值查询在MarkLogic中与“未筛选”搜索一起使用时返回意外结果
EN

Stack Overflow用户
提问于 2017-03-28 13:32:15
回答 2查看 58关注 0票数 1

当与field-value-query搜索一起使用时,我会得到错误的结果。

我将用下面的样本数据来解释这个问题。

XML:

代码语言:javascript
复制
<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

代码语言:javascript
复制
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"
)

输出:

代码语言:javascript
复制
<entry>
    <isbn>
        <type>hbk</type>
        <value>1234567</value>
    </isbn>
    <isbn>
        <type>pbk</type>
        <value>111111</value>
    </isbn>
</entry>

据我所知,上面的输出是错误的,因为它应该返回到<entry>以下。

代码语言:javascript
复制
<entry>
    <isbn>
        <type>hbk</type>
        <value>1234567</value>
    </isbn>
    <isbn>
        <type>pbk</type>
        <value>222222</value>
    </isbn>
</entry>

即使我运行cts查询时只有一个field-value-query,如下所示,结果也是相同的(条目的pbk值与111111相同)

代码语言:javascript
复制
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

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

注意:对于过滤搜索,它运行良好。

请帮助我理解为什么这种意想不到的行为和我能做什么来纠正它。

Tried:

代码语言:javascript
复制
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"
)
EN

回答 2

Stack Overflow用户

发布于 2017-03-28 15:01:04

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-03-28 15:25:47

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43071027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档