2017-03-06 11 views
1

特殊文字(@、=、#、$、%、^、*)が渡されたときに、フィールド値クエリが予期しない結果を示しています。予期しない結果を返す特殊文字とフィルタリングされていない検索のフィールド値クエリ?

私がMLに挿入した4つのサンプルドキュメントを見つけてください。

<root> 
    <journalTitle>Dinesh</journalTitle> 
    <sourceType>JA</sourceType> 
    <title>title1</title> 
    <volume>volume0</volume> 
</root> 

<root> 
    <journalTitle>Gayari</journalTitle> 
    <sourceType>JA</sourceType> 
    <title>title1</title> 
    <volume>volume0</volume> 
</root> 

<root> 
    <journalTitle>Dixit</journalTitle> 
    <sourceType>JA</sourceType> 
    <title>title1</title> 
    <volume>volume0</volume> 
</root> 

<root> 
    <journalTitle>Singla</journalTitle> 
    <sourceType>JA</sourceType> 
    <title>title1</title> 
    <volume>volume0</volume> 
</root> 

CTS問合せ:私はすべての文書を取得していますこのクエリを実行するには

cts:search(
    fn:doc(), 
    cts:field-value-query("Sample","#@#@#@*()", ("unwildcarded")), 
    "unfiltered" 
) 

私の理解によると、空のシーケンスを返す必要があります。

私が作成したフィールドを以下で見つけてください。 (XML形式)

フィールド:

<field xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://marklogic.com/xdmp/database"> 
    <field-name>Sample</field-name> 
    <field-path> 
     <path>/root/journalTitle</path> 
     <weight>1.0</weight> 
    </field-path> 
    <word-lexicons/> 
    <included-elements/> 
    <excluded-elements/> 
    <tokenizer-overrides/> 
</field> 

インデックスの設定:

Index setting

私はそれが与える検索文字列内の任意のアルファベット(複数可)を追加する場合私は正しい結果を返します。

同様:

  • の#$%のF @
  • ===== S
  • DF $ D

は、この問題を解決するために私を助けてください=== ?

答えて

2

cts:field-value-queryのオプションとして「正確な」渡してみてください。

cts:search(
    fn:doc(), 
    cts:field-value-query("Sample","#@#@#@*()", ("exact")), 
    "unfiltered" 
) 

をMarkLogicは、正確な値は、このような場合に支援するためのインデックスを持っています。大文字と小文字の両方の機密インデックスが有効になっている場合のみ有効です。私はこれがcts:element-value-queryのために働くことを知っているので、それはcts:field-value-queryのためにも期待します。

+0

はい、正しい結果が得られます。私はこれを試しました。しかし、私は大文字と小文字を区別しない検索が必要なので、オプションに '大文字小文字を区別しない 'を渡しているので、これを使うことはできません。 'case-insensitive'と' exact'の両方を渡すと、例外がスローされます - '無効なオプション' –

+0

型付き検索を 'advanced'に設定すると、問題は解決されます。 しかし、私は 'cts:element-word-query'と同じ問題を抱えています。 どのような解決策ですか? –

+0

明らかにあなたの実際のニーズは、質問で尋ねられたものを超えています。大文字小文字の区別やステミングが必要なことを話しているからです。だから私はあなたが何が必要なのかよくわからない。あなたのフィールドでは、句読点の文字を「記号」として定義することで、句読点が通常無視される、フィルタリングされていない検索で確実に索引付けされ、考慮されることができます。 – hunterhacker

2

代わりにfield-value-queryの 'exact'オプションを使用します。

これには、分音符号と大文字と小文字を区別するオプションが必要ですが、すでに有効になっています。

また、「正確」を使用して前後にxdmp:planを試して、クエリプランへの影響を確認することもできます。

+0

ステム検索を 'advanced'に設定すると、問題は解決されます。しかし、私は 'cts:element-word-query'と同じ問題を抱えています。どんな解決策ですか? –

0

上記のxmlsに対して、このcts:element-word-query(xs:QName( "journalTitle")、 "===== S")を渡す際にどのような出力が期待されますか。

+0

"============================================================================================================================================== S:上記のケースではすべての文書を取得しています...しかし、私は空のシーケンスを期待しています... –

0

データベースコンフィグで1文字の検索をtrueに変更すると、element-word-queryの問題が解決されます。

+0

1文字の検索インデックスは多くのスペースを必要とします!!余裕がありません。 –

関連する問題