#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