2017-05-04 7 views
2

に基づいて、私はいくつかの部分的観点からの結果と一致するようにしたいが、XQuery関数で検索複数が含まれています()トークン化文字列

  • 「JOHん」マッチ「ジョン・ドウ」
  • は「城を行う」も」と一致しますジョン・ドウ」
  • など

では(含まれている)、唯一の "ジョンはやる" または "JOHは" 結果と一致します。

$item[contains(., "john do")] 

私がそうしたいのですが...

$item[contains(., "joh") and contains(., "do")] 

...どんなに検索文字列内にあるどのように多くの用語。

私はトークン化()、それにループが、私はそれがあることが予想ように、そのループの結果が正確である

let $search := "john do" 
let $terms := fn:tokenize($search, '\s') 
let $query := string-join(
    (for $t in $terms 
    return 
     concat('contains(.,"', $t, '")') 
    ), ' and ' 
) 
return $query 

を望むものを作成するために使用しようとしている

が、それは効果がありませんXPathクエリでは、テキストだけだったので(明らかに、concat()はテキストのみを出力します)

$item[$query] 

私は何かが恋愛しましたか?その例では、関数はconcat()より優れていますか?

ありがとうございました!

答えて

1

あなたのアプローチは単に良い考えではありません。あなたはそうすることができますが、私はそうしないことを強く勧めます。あなたがしようとしているのは、評価するためのXPath/XQuery式を構築することです。つまり、コードを作成します。これは通常良い考えではありません。

代わりに、このクエリを作成する代わりにforループで条件を確認できます。さらに良いことに、XQueryおよびXPath(だけのXPath 2.0)ご使用のケースのために完璧にフィット定量化表現、持っている:

for $item in $items 
let $search := "john do" 
let $terms := fn:tokenize($item, '\s') 
where every $term in $terms satisfies contains($search, $term) 
return $item 

それは自然言語に非常に近いので、これは、把握することができれば簡単です:すべてを期間は特定の条件を満たす必要があります(あなたの場合は)

+0

ありがとう!私はそれらの表現を知らなかったし、それは完全に動作します。かなり速いです。 $ itemの代わりに$ searchをトークン化し、$ searchの代わりに$ itemに$ containsを追加しました $ itemの$ itemのために let $ search:= "john do" let $ terms: = fn:tokenize($ search、 '\ s') $ termsのすべての$ termがcontains($ item、$ term)を満たしています return $ item' –

+0

@GPええ、それはもっと一般的なユースケースのように聞こえます私は期待していただろう。しかし、私の問題の説明は、あなたが他の方法でそれを望むように読んでいます。とにかく、それは重要な概念です、変数を交換するのは簡単です:)それは助けて嬉しい – dirkk

関連する問題