2016-09-21 4 views
0

MarkLogicでドキュメントを検索したい。だから私は、化学的性質の最大値/最小値を経由して検索したいMarkLogic - 最大/最小フィルタで検索

<product xmlns="myns/products"> 
    <id>3114</id> 
    <materialNo xml:lang="en">1.1160</materialNo> 
    <steelName xml:lang="en">SWRCH24K</steelName> 
    <name xml:lang="en">wire, wire rod for cold heading</name> 
    <chemicalProperties> 
    <chemicalProperty> 
     <element>c</element> 
     <min>0.1900</min> 
     <max>0.2500</max> 
    </chemicalProperty> 
    <chemicalProperty> 
     <element>si</element> 
     <min>0.1000</min> 
     <max>0.3500</max> 
    </chemicalProperty> 
    <chemicalProperty> 
     <element>mn</element> 
     <min>1.3500</min> 
     <max>1.6500</max> 
    </chemicalProperty> 
    <chemicalProperty> 
     <element>p</element> 
     <max>0.0300</max> 
    </chemicalProperty> 
    </chemicalProperties> 
</product> 

マイドキュメントのように見えます。これを行うには、このxquery検索を使用します(簡単な例)。

上記のクエリはサンプルドキュメントを返します。 max-minが存在するかどうかを確認するサブクエリ(およびnot)があります。場合によっては、最小値または最大値のみが存在することもあります。

ただし、この文書は範囲外です。

私のデータベースには、最小値と最大値の要素範囲インデックスがあります。他のすべての設定はデフォルトです。

何が問題ですか?助言がありますか。提案のため

UPDATE

[OK]を、感謝しますがありません。値の位置を有効にしても問題は解決しません。しかし、この問題を回避するには、「と-ないクエリ」を削除し、「と、クエリ」と交換して、文書に新しい属性を追加することです:

<chemicalProperty hasMin="0" hasMax="1">... 

インデックスとそれらの属性を照会すると動作し、正しいを返します。結果。

+0

フォローアップの質問がある場合は、別のSOの質問として投稿してください。この質問が関連する場合は、新しい質問にリンクすることができます。 – wst

答えて

1

それが原因cts:element-query trueを返し、あなたのインデックスの設定、同じドキュメント内の任意の<chemicalProperty>minmaxクエリの試合は、単一<chemicalProperty>に制約されない場合は可能性があります。ただし、フィルタリングされていない検索でこれが表示されることが予想されますが、cts:searchへの呼び出しではそのオプションは表示されません。

最初にelement value positionsを有効にしてください。これにより、データベースがインデックスを使用して異なる要素からの一致を除外できるようにする必要があります。

cts:near-queryを使用して、要素クエリの値を位置によって制約することもできます。

+1

ポジションでこれを解決する必要があります。 cts:near-queryもそれらを必要とするか、またはcts:and-queryのように効果的に動作します。少なくとも、フィルタリングされていないときに実行します。 – grtjn

+0

@grtjn 'cts:near-query'は' cts:element-query'とは異なる位置インデックスを必要としますか?しかし、はい、私はちょっと混乱しています。行動を考えれば、今のところ安全な仮定は、OPが偶然に事例から外したということです。 – wst

+0

正しいです、 'cts:near-query'は異なる位置インデックスを必要とします。 http://docs.marklogic.com/cts:near-queryは次のように述べています。「単語位置インデックスは、cts:near-queryを使用するクエリのパフォーマンスを向上させます。要素ワード位置インデックスは、cts:near-queryを使用する要素クエリのパフォーマンスを向上させます。 – grtjn

0

この問題は、cts:element-value-queryコールでワイルドカードを使用しようとしているが、ワイルドカードを宣言していないことが原因と考えられます。リテラル "*"とは何も一致しないので、cts:and-not-queryはあなたが意図しているものと反対のことを行います。

cts:element-value-query( fn:QName("myns/products", "max"), "*", "wildcarded")

cts:element-value-query

また、ワイルドカードの指標の一つを可能にすることができ、およびMLは自動的にワイルドカードクエリを検出します:

あなたはこのような何かをしたいです。

"ワイルドカード"と "ワイルドカード"のどちらも存在しない場合、データベース構成と$ textはワイルドカードを決定します。データベースにワイルドカード文字( "3文字検索"、 "2文字検索"、 "1文字検索"、または "後続のワイルドカード検索")が有効になっていて、$ textにワイルドカード文字 '?または '*'の場合は「ワイルドカード」を指定します。それ以外の場合は、「非携帯」と指定します。

+0

通常、ワイルドカードオプションを宣言する必要はありません。いずれかのワイルドカードインデックスが有効になっている場合、ワイルドカード文字がクエリ文字列にある場合、 'wildcarded'オプションは暗黙的になります。 – wst

+0

ワイルドカードインデックスが有効になっていないことを「他のすべての設定はデフォルトです」と仮定しました。 – BenW

関連する問題