在solr 8的fl中使用父过滤器时,获取“嵌套模式时不应发送父过滤器”

时间:2019-04-03 05:24:11

标签: solr

我正在尝试获取带有子文档的父文档。但是出现“嵌套架构时不应发送父级筛选器”错误。

在我尝试过的下面附加查询。 q:{!parent which = content_type:person} fl:*,[child parentFilter = content_type:person]

下面是我添加到solr core的文档。

   Collection<SolrInputDocument> batch = new ArrayList<>();
   // Parent Doc 1, a person mamed John Jones
    SolrInputDocument person1 = new SolrInputDocument();
    person1.addField( "id",            "john_jones" );
    person1.addField( "content_type",  "person"     );
    // "_t" suffix tells Solr that it's text
    person1.addField( "first_name_t",  "John"       );
    person1.addField( "last_name_t",   "Jones"      );
    // states and history used in edismax examples
    person1.addField( "states_t",      "California Nevada Idaho Maine" );
    person1.addField( "history_t",     "safe accident accident accident accident accident" );

    // child docs, the vehicles he owns
    SolrInputDocument p1_car1 = new SolrInputDocument();
    p1_car1.addField( "id",            "jj_car1"    );
    p1_car1.addField( "content_type",  "car"        );
    // For cars "make" is an alias for "manufacturer"
    p1_car1.addField( "make_t",        "Honda"      );
    p1_car1.addField( "model_t",       "Accord"     );

    SolrInputDocument p1_car2 = new SolrInputDocument();
    p1_car2.addField( "id",            "jj_car2"    );
    p1_car2.addField( "content_type",  "car"        );
    p1_car2.addField( "make_t",        "Nissan"     );
    p1_car2.addField( "model_t",       "Maxima"     );

    SolrInputDocument p1_bike1 = new SolrInputDocument();
    p1_bike1.addField( "id",           "jj_bike1"   );
    p1_bike1.addField( "content_type", "bike"       );
    p1_bike1.addField( "make_t",       "Yamaha"     );
    p1_bike1.addField( "model_t",      "Passion"    );

    SolrInputDocument p1_bike2 = new SolrInputDocument();
    p1_bike2.addField( "id",           "jj_bike2"   );
    p1_bike2.addField( "content_type", "bike"       );
    p1_bike2.addField( "make_t",       "Peugeot"    );
    p1_bike2.addField( "model_t",      "Vivacity"   );

    // Add children to parent
    person1.addChildDocument( p1_car1  );
    person1.addChildDocument( p1_car2  );
    person1.addChildDocument( p1_bike1 );
    person1.addChildDocument( p1_bike2 );

    // Add parent to batch
    batch.add( person1 );


    // Parent Doc 2, person mamed Satish Smith
    SolrInputDocument person2 = new SolrInputDocument();
    person2.addField( "id",           "satish_smith" );
    person2.addField( "content_type", "person"       );
    person2.addField( "first_name_t", "Satish"       );
    person2.addField( "last_name_t",  "Smith"        );
    person2.addField( "states_t",     "California Texas California Maine Vermont Connecticut" );
    person2.addField( "history_t",    "safe safe safe safe safe safe safe safe accident" );

    // Vehicles (child docs)
    SolrInputDocument p2_car1 = new SolrInputDocument();
    p2_car1.addField( "id",            "ss_car1"     );
    p2_car1.addField( "content_type",  "car"         );
    p2_car1.addField( "make_t",        "Peugeot"     );
    p2_car1.addField( "model_t",       "iOn"         );
    SolrInputDocument p2_bike1 = new SolrInputDocument();
    p2_bike1.addField( "id",           "ss_bike1"    );
    p2_bike1.addField( "content_type", "bike"        );
    p2_bike1.addField( "make_t",       "Honda"       );
    p2_bike1.addField( "model_t",      "Spree"       );
    // link objects and add to batch
    person2.addChildDocument( p2_car1  );
    person2.addChildDocument( p2_bike1 );
    batch.add( person2 );

    System.out.println( "Adding batch of " + batch.size() + " parent docs" );

    // Submit as a group
    patientSolrClient.add( batch );
    patientSolrClient.commit()

3 个答案:

答案 0 :(得分:1)

我遇到了同样的错误,并尝试了教程中介绍的所有可能性,但是后来我发现我的managed-schema.xml对此有重复的记录。

自动生成的脚本:

<fieldType name="_nest_path_" class="solr.NestPathField" 
maxCharsForDocValues="-1" omitNorms="true" omitTermFreqAndPositions="true" stored="false" />

我手动添加的另一个:

<fieldType name="_nest_path_" type = "_nest_path_" />

我删除了条目,然后开始正常工作。

答案 1 :(得分:0)

我能够通过将文档标识符类型设置为_nest_path_来解决此问题,在您的情况下,这似乎是content_type键。然后在查询中,您不再需要设置fl=*,[child]对我有用的parentFilter参数。您仍然可以添加子筛选器,但是显然在Solr8中,文档存储在层次结构中,不再需要用户标识父项。

我从下面详细介绍的嵌套文档票证中了解了这一点:https://issues.apache.org/jira/browse/SOLR-12298

答案 2 :(得分:0)

注释以下行对我来说是一个中间解决方案(该行在您的核心的架构定义中定义)。

<field name="_nest_path_" type="_nest_path_"/>

可以通过这一段找出异常的原因 Code

(代码中的错误消息“嵌套模式时不应发送父过滤器”只是grep。您应该能够查明此异常的来源。)

虽然不太清楚逻辑背后的意图/原因