0

我试图了解设计我的 Solr Schema 的最佳方法是什么。并且是否有可能使用 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 Client (solrJ?)。

我还想知道从 1900 年到 1910 年的图书查询合同是如何形成的。

谢谢。

4

2 回答 2

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 回答
0

solr 不允许结构化对象。如果你想这样做,你必须定义实体。

例如,使用 Data Import Request Handler 传递

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

所以你可以有一个实体作为书籍,一个实体作为作者

于 2013-07-30T13:45:10.957 回答