2012-03-19 6 views
3

私はこのようなSchemaXmlを持っているのApache Solrの3.5セットアップ持っている:私は必要があるだろう何Apache Solrで複合キーフィールドを作成するには?

<field name="appid" type="string" indexed="true" stored="true" required="true"/> 
<field name="docid" type="string" indexed="true" stored="true" required="true"/> 

は一緒にそれらを連結して<uniqueKey>としてことを使用していますフィールドです。何も内蔵されていないようで、複数の値を持つidフィールドを作成し、<copyField>を使用するのには不十分ですが、uniqueKeyには単一値のフィールドが必要です。

私が必要とする唯一の理由は、クライアントが盲目的に<add>の呼び出しを発し、追加または更新の場合にSolrを呼び出すことができるようにすることです。したがって、私はあまり気にしませんどのようにのIDのように見えます。

私は自分のアナライザーまたはトークナイザーを作成する必要があると思いますか?私はSolrの学習を始めていますので、実際に何が必要なのかを100%確信していないし、実装する必要があることについてのヒントもありがたいです。

+0

java apiがdocsの追加や更新をどのように処理するのかよく分かりませんが、IDは見つかったら= docを更新し、そうでなければdocを挿入します。だから、私はIDが重要だと思います... – ajreal

+0

@ajrealはい、それは、uniqueKeyが指定されている場合、Solrの動作です。私の一意のIDは2つの異なるIDで構成されているため、その複合IDをアプリケーション開発者から検索サーバーに適切に作成する負担を軽減したいと考えています。 –

+0

@MichaelStum私のソリューションを試しましたか?あなたの考えを知ることができますか? – javanna

答えて

5

それぞれの文書にフィールドを追加するのはかなり簡単なので、私は個人的にその負担をユーザーに与えます。

そうしないと、数行のコードを書く必要があります。あなた自身のUpdateRequestProcessorFactoryを書くと、既存の他のフィールドの値に基づいて新しいフィールドをすべての入力ドキュメントに自動的に追加することができます。セパレータを使用して単一の値にすることができます。

@Override 
public void processAdd(AddUpdateCommand cmd) throws IOException { 
    SolrInputDocument doc = cmd.getSolrInputDocument(); 
    String appid = (String)doc.getFieldValue("appid"); 
    String docid = (String)doc.getFieldValue("docid"); 
    doc.addField("uniqueid", appid + "-" + docid);  
    // pass it up the chain 
    super.processAdd(cmd); 
} 

次にあなたがチェーン(solrconfig.xml)の最初のプロセッサとしてカスタマイズしupdateRequestProcessorChainにごUpdateProcessorを追加する必要があります:あなたのUpdateRequestProcessorあなたは、このようなprocessAddメソッドをオーバーライドする必要がありますオン

<updateRequestProcessorChain name="mychain" > 
    <processor class="my.package.MyUpdateRequestProcessorFactory" /> 
    <processor class="solr.RunUpdateProcessorFactory" /> 
    <processor class="solr.LogUpdateProcessorFactory" /> 
</updateRequestProcessorChain> 

がそれを願っています私はそれを試していない。私はすでにこのようなことをしましたが、uniqueKeyやrequiredフィールドではできませんでした。それはあなたが見つけることができる唯一の問題です。しかし、チェーンの始めにupdateProcessorを置くと、うまくいくはずです。

+0

最後に試してみましたが、私はそれを見てみましたが、アプローチはうまくいっていたようでした。再度、感謝します! –

関連する問題