为什么hasChildDocuments()方法在solr中返回null?

时间:2017-05-26 12:52:19

标签: solr solrj solrcloud

我要求我需要处理父文件和子文档,因此我已经阅读了SolrJ API和一些博客,并且我编写了以下代码。

根据我的程序,我有一份父文件(即doc)和一份子文件(即doc2)。它的索引和工作正常。

但是在下一步中,我试图用一些与父文档匹配的查询字符串(即p_5803)进行查询。现在它已经返回了子文档和父文档。直到现在还可以。但是为什么document.hasChildDocuments()即使对于父文档也会返回“false”?

因为它有一个子文档,它应该返回“true”。我可以知道我的程序有什么问题。请检查程序和输出并帮助我。

注意:我使用的是solr-solrj-4.10.3-cdh5.8.0.jar

import java.io.IOException;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;

public class SolrCloudDemo {

    public static void main(String[] args) throws SolrServerException,
            IOException {
        HttpSolrServer solr = new HttpSolrServer(
                "http://localhost:8983/solr/collection1");
        System.out.println(solr.ping());

        SolrInputDocument doc = new SolrInputDocument(); // main doc
        SolrInputDocument doc2 = new SolrInputDocument(); // child doc

        doc.addField("id", "p_5804");
        doc.addField("name", "Prasad chowdary");

        doc2.addField("id", "c_5804");
        doc2.addField("name", "Prasad chowdary");
        // adding a child document
        doc.addChildDocument(doc2);
        solr.add(doc);
        solr.commit();

        SolrQuery query = new SolrQuery();
        query.setQuery("p_5803");

        QueryResponse resp = solr.query(query);

        SolrDocumentList docList = resp.getResults();
        System.out.println("docList ==> "+docList);

        for (SolrDocument document : docList) {
            System.out.println("doc ==> " + document);
            System.out.println("has child ==> " + document.hasChildDocuments());
        }
    }
}

以下是输出

 docList ==> {numFound=2,start=0,docs=[SolrDocument{id=p_5803, name=Prasad chowdary, _version_=1568168978219532288}, SolrDocument{id=c_5803, name=Prasad chowdary}]}
doc ==> SolrDocument{id=p_5803, name=Prasad chowdary, _version_=1568168978219532288}
has child ==> false
doc ==> SolrDocument{id=c_5803, name=Prasad chowdary}
has child ==> false

1 个答案:

答案 0 :(得分:0)

好的,所以发生的事情是:

  1. Solr将这两个文档存储为独立的文档,然后在两个文档之间进行链接,并知道一个是另一个的孩子。但是你总是可以自己找回孩子。
  2. 您正在使用一些匹配两个文档的分析器(可能是ID上的一些Ngram或模糊内容?),因此返回两个文档。但索尔并不知道一个人是另一个人的孩子。
  3. 您希望仅返回父文档,为此您通常会添加一个fq,其中包含用于区分父/子doc的字段:

    $('.view_it').on('click', function(e){
        e.preventDefault();
        var f = this.parentNode;
        f.submit();
    });
    
  4. 如果要将子项检索为父文档的一部分,请使用 ChildDocTransformerFactory喜欢这样:

    &fq=isparent:true