0

Solr スキーマを設計する最善の方法を理解しようとしています。そして、solrJを使用してより簡単な方法でそれを行う可能性がある場合.
現在、solr のサンプル サーバーを使用しているので、solr がどのように機能するかを理解できます。ここまで正しく理解できていれば、次のスキーマを定義する方法は次のとおりです。

Book= { title: String,
        year: Int } 

Author = { name: String,
           books: [book] } <-- list/array of book objects 

CopyFieldsを使用することです:

<fields>
    <field name="name" type="string" indexed="true" stored="true" multiValued="false"/>
    <field name="books" type="string" indexed="true" stored="false" multiValued="false"/>
    <!-- books will contain: --> 
    <field name="title" type="string" indexed="true" stored="true" multiValued="true"/>
    <field name="year" type="int" indexed="true" stored="true"/>
</fields>
<copyField source="title" dest="books"/>
<copyField source="year" dest="books"/>

私は正しかったですか?もしそうなら、新しい著者をデータベースにアップロードするにはどうすればよいですか? solr-clientを使用してnode.jsサーバーからアップロードしようとしました:

function ADDONE(){
    var docs = [];
    //generate 4 docs.
    for(var i = 0; i <= 4 ; i++){
       var doc = {
            id : 20 + i , 
            name : "Author"+i ,
            books: [{title: "firstBook" , year: 1900+i} , 
                    {title: "SecondBook" , year: 1901+i} ]

       }
       docs.push(doc);
    }
    // Add documents to Solr
    client.add(docs,function(err,obj){
       if(err){
          console.log(err);
       }else{
          console.log(obj);
       }
    });

}
ADDONE();

しかし、これはうまくいきません。各ドキュメントを定義する正しい方法は何ですか? 私も近いですか?私が示した例は node.js solr-client 用に書かれていますが、私は Java を使用することを好み、それは solr クライアント (solrJ?) です。

また、1900 年から 1910 年までの書籍のクエリの契約がどのように形成されたかも知りたいです。

ありがとう。

4

2 に答える 2

0

solr は構造化オブジェクトを許可しません。これを行うには、エンティティを定義する必要があります。

たとえば、Data Import Request Handler で渡す

http://wiki.apache.org/solr/DataImportHandler#Full_Import_Example

したがって、本に対して 1 つのエンティティと、著者に対して 1 つのエンティティを持つことができます。

于 2013-07-30T13:45:10.957 に答える
0

ダイナミクス フィールドを使用することもできます

<fields>
    <field name="name" type="string" indexed="true" stored="true" multiValued="false"/>
    <field name="books" type="string" indexed="true" stored="false" multiValued="false"/>
    <dynamicField name="books_year_*"  type="string" indexed="true"  stored="true" multiValued="false"/>
    <dynamicField name="books_title_*"  type="string" indexed="true"  stored="true" multiValued="false"/>
    <field name="book_title" type="string" indexed="true" stored="true" multiValued="true"/>
    <copyField source="books_title_*" dest="book_title"/>
    <field name="book_year" type="string" indexed="true" stored="true" multiValued="true"/>
    <copyField source="books_year_*" dest="book_year"/>

</fields>

そしてあなたの方法で、

books: [{title: "firstBook" , year: 1900+i} => 
"books_title_"+i : firstBook
"books_year_"+i : 1900+i

クエリ:

select?q=book_year:"1970"
于 2013-07-30T14:22:51.207 に答える