2017-03-02 6 views
0

フィルタリングされていない検索が間違った結果を示しています。MarkLogicの "フィルタリングされていない"検索の予期しない動作

下記のxmlサンプルと問題をご覧ください。

サンプル:私は<entry>ノードの下に提示しなければならない<volume> & <issue>両方の値の組み合わせを持つエントリノードを取得する必要が

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

(のような:体積10 &問題-10、ボリューム10 &問題-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

でDBに格納されたとも私に他のエントリ(<entry>)を返しています。

"フィルタリング済み"検索を実行すると、上記のクエリで正しい結果が返されます。

どうして起こっているのか、何が解決策になるのか教えてください。

volume and issueの組み合わせを持つエントリノードを取得する他の方法がある場合は、お知らせください。

+0

インデックス「要素値の位置」を有効にしてみてください。 – wst

+0

@wst既に "true"に設定されていますが、依然として問題に直面しています。 –

+0

私は正確に覚えていませんが、単語の位置と要素の単語の位置を試してみることもできます。さもなければ、私はインデックスから、そしてフィルタリングされていないクエリから解決できるものを使い果たし、データを改造する必要があると思います。 – wst

答えて

4

データモデルの変更も検討する必要があります。 MarkLogicは、1ドキュメント= 1行のときに最もよく使用されます。そのパターンに従うと、より効率的な照会ができ、小さな索引を使用することができます。これらの索引はすべて文書内のファクトを対象としており、このようなサブ文書の制約を受けるためには、高価な検索や高価な検索を行うポジションを使用する必要があります。

関連する問題