2016-09-04 21 views
0

私はApache Solrの新機能です。いくつかの調査を行い、インデックス作成の仕方を学びました。 現在、私はJSONファイルインデックスの問題に直面しています。Apache solrがJSONファイルのインデックスを作成できません

下記のJSONファイルのデータフォーマットにインデックスを付けることができません。 "ドキュメント"配列を削除した後、私はできます。 なぜ起こっているのか分かりません。

構成用のschema.xmlファイルは追加されていません。 私はインデックス作成を行うことができるものをApacheのsolrにあるいくつかのサンプルで試しました。

また、schema.xmlファイルでidを使用するのは何ですか? 私のJSONがemployidが含まれている場合、私はいくつかのいずれかが助けてください代わりに「ID」の

[{ 
    "employid": "E64492", 
    "employGroup": "ABC ABC GROUP", 
    "ssn": "BE0003565737", 
    "country": { 
     "countryId": "56", 
     "countryName": "india" 
    }, 
    "sector": { 
     "sId": "40", 
     "sName": "name" 
    }, 
    "documents": [{ 
     "language": "EN", 
     "fileName": "Helloworld.pdf", 
     "fileExists": true, 
     "employid": "E64492" 
    }], 
}] 

をemployidを追加することができます。

Excpetion詳細:

"org.apache.solr.common.SolrException"],"msg":"Error parsing JSON field value. Unexpected OBJECT_START at [227], field=documents","code":400}} 

答えて

1

あなたが挿入しようとしている文書に対応するためのスキーマを定義する必要があります。
また、あなたがidフィールドについて文書

"documents": [{ 
    "language": "EN", 
    "fileName": "Helloworld.pdf", 
    "fileExists": true, 
    "employid": "E64492" 
}], 

後に余分な,を持って、あなたはemploye_idに名前を変更だけでなく、あなたはまたなしでスキーマを持つことができます

をemploye_idするタグ<uniqueKey>id</uniqueKey>を変更してくださいすることができますunique_key。ユニークキーの詳細については、thisを参照してください。

+0

私は余分なカンマを削除しましたが、同じ問題 – Maddy

+0

私はemploye_idとemployeidの違いを理解していませんでした。私はこのように使う必要があります。 employid Maddy

+0

違いはありません。それは単にフィールドの名前です。あなたはemployeidを使うことができます。 uniqueKeyフィールドに関しては、それはあなたが使用する必要があります。 –

1

問題はthe Solr Reference guide section on indexing with JSONで説明されていますが、すべてのテキストの中で見るのは少し難しいです。あなたが直接Solrの規則を使用してフィールドと再帰的な構造を指定

  1. Solrの入力フォーマット:

    は、基本的には、JSONに対処するための2つの方法があります。この形式では、各オブジェクトの構造について明示的に示すように、複数のJSONオブジェクトをパーサに渡すことができます。指定したルールに従ってSolrの文書にマッピングされる

  2. 一般的なJSON形式(またはあなたのコレクションのためにsolrconfig.xmlにデフォルトで指定されている)あなたが使用

配列構文は、最初のオプションのためです - ソル入力形式。しかし、そのフォーマットは、オブジェクトの残りの部分の構造にネストされたドキュメントをサポートしていないので、代わりに_childDocuments_配列が必要です。

一般的なJSONパーサーでは1つのオブジェクトしか使用できません。

あなたは交差道路にいるので、自分がしたいことを決める必要があります。これは、おそらく、あなたが最終的に望むスキーマと、それを明示的に定義するのかマッピングルールを使用して定義するのかを考えることを意味します。

1

Maddyあなたがインデックスを作成しようとしているのは入れ子になったJSONオブジェクトです! Solrは、JSONデータをFLAT形式でのみ索引付けすることができます。つまり、あなたがしようとしている方法でCountryオブジェクトとSectorオブジェクトをインデックスすることはできません。別々のフィールドとしてそれらを平坦化する必要があります。つまり、Country.countryIdは別々のフィールドでなければなりません.CountryNameは別のフィールドでなければなりません。同様に、Sector.sIdは別のフィールドでなければならず、Sector.sectorNameは別のフィールドでなければなりません。また、最後の文書のJSONオブジェクト内のオブジェクトは、従業員IDが宣言されたのと同じ方法で宣言する必要があります。文書オブジェクトを削除し、すべてのフィールドを自由に配置する必要があります。私はあなたがポイントを得ることを願っています。これは100μで動作します。繰り返しますが、ネストされたJSONをこのように索引付けすることはできません。JSONを最も簡単に平坦化する必要があります。それが助けてくれたら教えてください:)。下のポイントを理解するには、Solrの管理画面でこのJSONを取得してDocumentsセクションでインデックスを作成し、F12をクリックしてネットワークタブをChromeやその他のブラウザで開いたままにしてみましょう。コンソールに入る!これは、CountryオブジェクトとSectorオブジェクトを同じに保つことができますが、データオブジェクトを削除し、その中のフィールドを自由に宣言する必要がある理由です。

0

最後に、私は私がより多くのSolrを理解するのに役立ったすべてのご意見について

 <field name="buyLimit" type="tdoubles"/> 
     <field name="country.countryId" type="tlongs"/> 
     <field name="country.countryName" type="strings"/> 
     <field name="creationDate" type="tlongs"/> 
     <field name="currency" type="string" indexed="true" stored="true"/> 
     ***<field name="documents.fileExists" type="booleans"/> 
     <field name="documents.fileName" type="strings"/> 
     <field name="documents.language" type="strings"/> 
     <field name="documents.researchId" type="strings"/>*** 
     <field name="opinion.opinion" type="strings"/> 
     <field name="opinion.opinionId" type="strings"/> 
     <field name="employeId" type="string" multiValued="false" indexed="true" stored="true"/> 
     <field name="s.sId" type="tlongs"/> 
     <field name="s.sName" type="strings"/> 
     <field name="type" type="string" indexed="true" stored="true"/> 

感謝の下に指定されたスキーマ定義を追加した後、インデックス作成を行うことができると思います。

関連する問題