Преобразователь [дочернего] документа Solr, возвращающий пустые дочерние поля

#solr #solrj #spring-data-solr #solr8

#solr #solrj #spring-data-solr #solr8

Вопрос:

Я пытаюсь вернуть дочерние поля документа с родительским элементом в списке полей запроса.

В версии 7.7 Solr нам пришлось указать fl=*,[child parentFilter=type:account] , который будет корректно возвращать все родительские поля вместе со связанными дочерними документами типа account .

В версии 8.x Solr все изменилось с введением _nest_path_ . Мы правильно включаем как FieldType _nest_path_ , так и поле _nest_path_ в схему (оно генерируется SolrJ).

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

Мы можем правильно запрашивать поля дочернего документа по отношению к родительскому, но не можем вернуть поля дочернего документа.

В моем примере у меня есть два родительских документа (учетная запись), каждый с 3 дочерними документами (политика).

Вот плоская структура, возвращаемая *:*

 {
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":25,
    "params":{
      "q":"*:*",
      "_":"1611069992439"}},
  "response":{"numFound":8,"start":0,"maxScore":1.0,"numFoundExact":true,"docs":[
      {
        "id":"policy-1",
        "type":["policy"],
        "_version_":1689330740566687744},
      {
        "id":"policy-2",
        "type":["policy"],
        "_version_":1689330740566687744},
      {
        "id":"policy-3",
        "type":["policy"],
        "_version_":1689330740566687744},
      {
        "id":"account-1",
        "name":["Harvey John Birdman"],
        "type":["account"],
        "_version_":1689330740566687744},
      {
        "id":"policy-4",
        "type":["policy"],
        "_version_":1689330740571930624},
      {
        "id":"policy-5",
        "type":["policy"],
        "_version_":1689330740571930624},
      {
        "id":"policy-6",
        "type":["policy"],
        "_version_":1689330740571930624},
      {
        "id":"account-2",
        "name":["Billy George Zane"],
        "type":["account"],
        "_version_":1689330740571930624}]
  }}
 

Вот ответ для q=type:accountamp;fl=*,[child]

 {
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":28,
    "params":{
      "q":"type:account",
      "fl":"*,[child]",
      "_":"1611069992439"}},
  "response":{"numFound":2,"start":0,"maxScore":0.5822426,"numFoundExact":true,"docs":[
      {
        "id":"account-1",
        "name":["Harvey John Birdman"],
        "type":["account"],
        "_version_":1689330740566687744},
      {
        "id":"account-2",
        "name":["Billy George Zane"],
        "type":["account"],
        "_version_":1689330740571930624}]
  }}
 

И если я не возвращаю никаких родительских полей, я получаю пустые результаты (без дочерних данных)

 {
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":29,
    "params":{
      "q":"type:account",
      "fl":"[child]",
      "_":"1611069992439"}},
  "response":{"numFound":2,"start":0,"maxScore":0.5822426,"numFoundExact":true,"docs":[
      {},
      {}]
  }}
 

Я использую абстракцию Spring в SolrJ, но использую SolrJ direct с SolrInputDocument результатами в том же самом. Упоминая это на случай, если в любой из этих библиотек есть какие-либо известные ошибки.

Версия Solr = 8.5.2

Версия SolrJ = 8.5.2