2016-05-26 13 views
3

search:searchを実行するときに特定の要素に対してのみワイルドカード検索を行う方法を探しています。具体的には、私は次のようになり、文書可能性があります:ワイルドカードで特定の要素のみを検索する

<pdbe:person-envelope xmlns:pdbe="http://schemas.abbvienet.com/people-db/envelope"> 
    <person xmlns="http://schemas.abbvienet.com/people-db/model"> 
    <costcenter> 
     <code>0000601775</code> 
     <name>DISC-PLAT INFORM</name> 
    </costcenter> 
    <displayName>Tj Tang</displayName> 
    <upi>10025613</upi> 
    <firstName> 
     <preferred>TJ</preferred> 
     <given>Tze-John</given> 
    </firstName> 
    <lastName> 
     <preferred>Tang</preferred> 
     <given>Tang</given> 
    </lastName> 
    <title>Principal Research Scientist</title> 
    </person> 
    <pdbe:raw/> 
</pdbe:person-envelope> 

検索が起こるとき、私は検索テキストが自動的にワイルドカードを使ったことにしたいが、唯一のdisplayName、firstNameの、lastNameのような特定の要素のためではなく、UPIのためにかコード。私が理解しているように、データベース内で特定のワイルドカード関連のインデックスを有効にする必要がありますが、ワイルドカード検索の対象となる各要素に対して、クエリを複数のcts:element-queryおよびcts:element-value-queryのステートメントに書き換えるカスタムクエリパーサーが必要です最初に解析された検索クエリを使用します。あるいは、フィールド制約を作成し、フィールド制約を使用するようにクエリを書き直すこともできます。

ユーザーが単純な検索クエリとして入力した場合、一部の要素でワイルドカードを使用して条件付きで検索する別の方法はありますか?部分的な名字「TJ Tan」ですが、 "100256"。

答えて

5

あなたは正しい方向にあります。 "TS Tan"に関する要素(または多分フィールド)クエリを取ることができます

cts:tokenizeとすると、これを壊すことができます(cs:tokenizeについて読む - これは通常のトークナイザではありません)。

その後、私はあなたが単語がないカーディング・ワイルドとそのことと、適切なCTSクエリ(おそらく、個々の単語のクエリ内を構築すべきで適用するビジネスルールのようなものを行うことができ、「TS」と「タン」

を持っていますおよびステートメント(または近いクエリ)は、必要に応じてチューニングします。

検索フレーズをトークン化した結果、ワイルドカードインデックスに依存しない結果が得られるかもしれないと考えることもできますが、要素語彙辞書には、word-matchesで用語展開を行い、クエリに送信されます。

私たちは時々十分な結果を得ることができない場合、クエリビルディングをxdmp:estimateと組み合わせてクエリをあまり制限しないことがあります。

このロジックはどこに配置しますか? 検索:検索の場合は、この場合はカスタム制約にパッケージ化することをおすすめします。

関連する問題