0

フィルタリングされていない検索で間違った結果が返されます。

以下の 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 & issue-10, volume-10 & 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.xmluriで DB に格納されていると仮定します。

上記のクエリは、他のエントリ ( <entry>) も返します。

「フィルタリングされた」検索を実行すると、上記のクエリは正しい結果を返します。

なぜそれが起こっているのか、解決策は何か教えてください

の組み合わせを持つエントリ ノードを取得する他の良い方法があればvolume and issue教えてください。

4

1 に答える 1

4

データ モデルの変更も検討する必要があります。MarkLogic は、1 ドキュメント = 1 行の場合に最適です。そのパターンに従えば、クエリがより効率的になり、より小さなインデックスを使用できます。インデックスはすべてドキュメント内の事実に基づいており、このようなサブドキュメントの制限を取得するには、コストがかかる可能性のある位置を使用するか、さらにコストがかかるフィルター検索を使用する必要があります。

于 2017-03-02T16:03:26.627 に答える