"未经过滤的#34;在MarkLogic中搜索

时间:2017-03-02 15:20:20

标签: marklogic marklogic-7 cts-search

未过滤的搜索结果错误。

请找到以下xml样本和问题。

样品:

<root>
    <id1>11</id1>
    <elem1>ee1</elem1>
    <ele2>ee2</ele2>
    <entry>
        <volume>10</volume>
        <issue>10</issue>
        <elemEntry>eleme</elemEntry>
    </entry>
    <entry>
        <volume>20</volume>
        <issue>20</issue>
        <elemEntry>eleme</elemEntry>
    </entry>
    <entry>
        <volume>20</volume>
        <issue>10</issue>
        <elemEntry>eleme</elemEntry>
    </entry>
    <entry>
        <volume>10</volume>
        <issue>20</issue>
        <elemEntry>eleme</elemEntry>
    </entry>
</root>

我必须得到<volume> & <issue>值组合的入口节点都应出现在<entry>节点下(例如:volume-10&amp; issue-10,volume-10&amp; issue-20)

如上例所示,我需要整个输入节点为<volume> (10), <issue> (10)

它不应该返回其他入口节点,因为其他入口节点没有所需的volume(值10),issue(值10)组合。

请在下面找到我正在做的cts:search

cts:search(
    doc("/sample.xml")//entry,
    cts:and-query((
        cts:element-value-query(xs:QName("volume"), "10", ("case-insensitive","unstemmed")),
        cts:element-value-query(xs:QName("issue"), "10", ("case-insensitive","unstemmed"))
    )),
    "unfiltered"
)

假设样本xml存储在具有/sample.xml uri

的数据库中

以上查询也会返回其他条目(<entry>)。

如果我执行&#34;过滤&#34; 搜索,则上述查询会返回正确的结果。

请告诉我,为什么会这样,解决方案是什么

如果还有其他好办法让条目节点与volume and issue组合,请告诉我。

1 个答案:

答案 0 :(得分:4)

您还应该考虑更改数据模型。当1个文档= 1行时,最好使用MarkLogic。如果您遵循该模式,您将拥有更高效的查询并可以使用更小的索引。索引都是以文档中的事实为导向的,并且要获得像这样的子文档限制,你需要使用位置,这可能会变得昂贵,或者过滤搜索,这些更加昂贵。