2015-12-13 8 views
5

私はSolr 5.3.1に問題があります。私のスキーマはかなりシンプルです。私は文字列としての "id"である1つのuniqueKeyを持っています。索引付けされ、格納され、必要であり、非多値です。Solrは上書きしません - 複製されたuniqueKeyエントリ

"content_type:document_unfinished"でドキュメントを追加した後、は、同じドキュメントで同じidでもう1つのcontent_type:documentを上書きします。ドキュメントはインデックス内で2回表示されます。ここでも、唯一のuniqueKeyは文字列のように "id"です。 idはもともとmysql-indexプライマリintから来ています。これがない一度だけ起こるよう

もなります。私の場合は

http://lucene.472066.n3.nabble.com/uniqueKey-not-enforced-td4015086.html

http://lucene.472066.n3.nabble.com/Duplicate-Unique-Key-td4129651.html

インデックス内のすべての文書が複製されていない、単にいくつか。最初は、インデックスに同じuniqueKeyが存在する場合にコミット時に上書きされると仮定していました。私はそれが期待どおりに動作していないようです。ドキュメント内のいくつかのフィールドを更新するだけではなく、すべての子と完全に置き換えたいと思います。

いくつかの統計情報:インデックス内の約350k文書。主にchildDocumentsを使用します。ドキュメントは、「content_type」フィールドによって区別される。私はそのようにそれらをインポートするためにSolrJを使用:

HttpSolrServer server = new HttpSolrServer(url); 
server.add(a Collection<SolrInputDocument>); 
server.commit(); 

私はいつも、もう一度、すべての子どもたちと、文書全体を追加しています。あまりにも恐ろしいものはありません。私は、同じuniqueKeyのために重複したドキュメントで終わる。サイドインジェクションはありません。私は統合された桟橋でSolrだけを走らせます。私は "手動で" Javaでluceneインデックスを開かない。

私がしたのは、+挿入をもう一度削除することでした。それはしばらくのために働くように見えたが、その後、いくつかの条件の下で開始すると、このエラーメッセージを与える:両親にマッチしていない

親クエリ利回りの文書をそれが起こる

をフィルタリングする文書があると思われます完全にランダムで、ちょうど1つのことが出現するようです:そのchildDocumentは起こります。私は特別なことはしません。基本的にウェブサイトからsolrパッケージをダウンロードして実行します。bin/solr start

誰でもアイデアはありますか?

EDIT 1

私はバグのようです、問題を見つけたと思いますか?問題を再現するには

私はSolr 5.3.1を仮想ボックスのDebianにダウンロードし、で起動しました。基本設定が適用された新しいコアが追加されました。基本設定セットで何も変更されず、単にそれをコピーしてコアを追加しました。

これはインデックス内の同じIDを持つ2つのドキュメントをもたらす:で検索

SolrClient solrClient = new HttpSolrClient("http://192.168.56.102:8983/solr/test1"); 
    SolrInputDocument inputDocument = new SolrInputDocument(); 
    inputDocument.setField("id", "1"); 
    inputDocument.setField("content_type_s", "doc_unfinished"); 
    solrClient.add(inputDocument); 
    solrClient.commit(); 
    solrClient.close(); 

    solrClient = new HttpSolrClient("http://192.168.56.102:8983/solr/test1"); 
    inputDocument = new SolrInputDocument(); 
    inputDocument.setField("id", "1"); 
    inputDocument.setField("content_type_s", "doc"); 
    SolrInputDocument childDocument = new SolrInputDocument(); 
    childDocument.setField("id","1-1"); 
    childDocument.setField("content_type_s", "subdoc"); 
    inputDocument.addChildDocument(childDocument); 
    solrClient.add(inputDocument); 
    solrClient.commit(); 
    solrClient.close(); 

http://192.168.56.102:8983/solr/test1/select?q=% 3A &重量= JSON &インデント=真

はに導きます次の出力:

{ 

    "responseHeader": { 
    "status": 0, 
    "QTime": 0, 
    "params": { 
     "q": "*:*", 
     "indent": "true", 
     "wt": "json", 
     "_": "1450078098465" 
    } 
    }, 
    "response": { 
    "numFound": 3, 
    "start": 0, 
    "docs": [ 
     { 
     "id": "1", 
     "content_type_s": "doc_unfinished", 
     "_version_": 1520517084715417600 
     }, 
     { 
     "id": "1-1", 
     "content_type_s": "subdoc" 
     }, 
     { 
     "id": "1", 
     "content_type_s": "doc", 
     "_version_": 1520517084838101000 
     } 
    ] 
    } 
} 

私は間違っていますか?

+0

(最初から右の子のドキュメントを追加) 、それは文書の平易な更新で、それはインデックスに同じユニークキーを持つドキュメントが2回存在します。私はまた、solrClient経由で文書を明示的に削除しようとすることができると考えました。deleteById(id)。これは問題を解決するようですが、これは実際の修正ではないことを述べているので、私はまだ心配しています。 – SebastianRiemer

+0

私は小さなJavaテストアプリケーションを記述しました。ここで見つけることができます:https://github.com/sebastianriemer/SolrDuplicateTest 私はあなたが私と同じ結果を得るかどうかを知ることに興味があります。私はsolr-userメーリングリストにも書きましたが、ここに回答を投稿します。 – SebastianRiemer

+0

私は、Solrが別のものとは異なる子のドキュメントを扱っているところを読んでいたと思います。私はそれを読んでいた場所を思い出すことはできませんが、最初の文書からすぐにサブ文書を追加し始めました。それ以来、私は上書きしていますが、私はまだSolrのユニークなキーを扱っていない "バグ"と考えています。私は毎日数10k文書をインデックスに追加しています。 –

答えて

3

ご意見ありがとうございます。そうでなければ長すぎるので、私はこれを答えとして書きます。

ミハイルKhludnev こんにちはセバスチャン、

スタンドアロンドキュメントと動作しないブロックをミキシング:私は実際にメーリングリストから同じ応答を得ました。 公開の問題がたくさんあります。 15:02の水曜日、2016年3月9日に

、セバスチャン・リーマー は書いた:

こんにちは、

はなく、実際にちょうど テストへのリンクを、短期的に私の問題を記述するために

1)親として新しい文書を作成し、

SolrInputDocument parentDoc = new SolrInputDocument(); 
    parentDoc.addField("id", "parent_1"); 
    parentDoc.addField("name_s", "Sarah Connor"); 
    parentDoc.addField("blockJoinId", "1"); 
    solrClient.add(parentDoc); 
    solrClient.commit(); 
をコミット:私は次の手順を実行しSolrJを使用してapplicaton、

2)子 文書で)1と同一のユニーク-idを持つ新しい文書を作成し

SolrInputDocument parentDocUpdateing = new SolrInputDocument(); 
    parentDocUpdateing.addField("id", "parent_1"); 
    parentDocUpdateing.addField("name_s", "Sarah Connor"); 
    parentDocUpdateing.addField("blockJoinId", "1"); 

    SolrInputDocument childDoc = new SolrInputDocument(); 
    childDoc.addField("id", "child_1"); 
    childDoc.addField("name_s", "John Connor"); 
    childDoc.addField("blockJoinId", "1"); 

    parentDocUpdateing.addChildDocument(childDoc); 
    solrClient.add(parentDocUpdateing); 
    solrClient.commit(); 

3を追加)Solrのインデックス

のid = "parent_1" との2つの文書での結果

これは正常な動作ですか?私は、同じIDを持つ新しい文書を生成する代わりに、既存の文書を に更新する必要があると考えました。

完全に動作するテストアプリケーションについては、元のメッセージを参照してください。

敬具、 セバスチャン

私はそれは既知の問題だと思う、との種類の本に関連するいくつかのチケットが存在するが、私はそれに対処する方法があることをうれしく思います私もSolrJを使用し、私はまた、childDocumentsを使用して、私もつい最近検出された:(https://issues.apache.org/jira/browse/SOLR-6096https://issues.apache.org/jira/browse/SOLR-5211https://issues.apache.org/jira/browse/SOLR-7606)私は現在、あなたに非常に似ているように思える状況に直面しています

+0

問題をサマライズしてくれてありがとう。それが本当に解決策であるかどうかはわかりません。それは単に本当に悪い回避策を私に思い出させる。とにかく、私は答えとして受け入れるだろう、さらに厳しい私はその行動に本当に満足していない。一種の失望の種類は、ソルのドキュメンテーションで大胆な赤い文字で言及されていない... –

関連する問題