lucene-solr-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Florian Fankhauser <f.fankhau...@littera.eu>
Subject Sort by nested field but only in matching nested documents
Date Thu, 01 Feb 2018 14:22:07 GMT
Hello,
given the following document structure (books as parent, libraries having these books as children):

<update>
    <add>
        <doc>
            <field name="doc_type_s">book</field>
            <field name="id">1000</field>
            <field name="title_t">Mr. Mercedes</field>
            <field name="autor_t">Stephen King</field>
            <doc>
                <field name="doc_type_s">library</field>
                <field name="id">1000/100</field>
                <field name="acquisition_date_i">20160810</field>
                <field name="city_t">Innsbruck</field>
            </doc>
            <doc>
                <field name="doc_type_s">library</field>
                <field name="id">1000/101</field>
                <field name="acquisition_date_i">20180103</field>
                <field name="city_t">Hall</field>
            </doc>
        </doc>
        <doc>
            <field name="doc_type_s">book</field>
            <field name="id">1001</field>
            <field name="title_t">Noah</field>
            <field name="autor_t">Sebastian Fitzek</field>
            <doc>
                <field name="doc_type_s">library</field>
                <field name="id">1001/100</field>
                <field name="acquisition_date_i">20170810</field>
                <field name="city_t">Innsbruck</field>
            </doc>
        </doc>
    </add>
</update>

Now i want to get all books located in libraries in city "Innsbruck", sorted by acquisition
date descending.
In other words: i want to filter in the field city_i in the child documents, but return only
the parent document. And i want to sort by the field acquisition_date_i in the child documents
in descending order, newest first.

My first try:
-----

URL:
http://localhost:8983/solr/test1/select?q=title_t:*&fq={!parent%20which=doc_type_s:book}city_t:Innsbruck&sort={!parent%20which=doc_type_s:book%20score=max%20v=%27%2Bdoc_type_s:library%20%2B{!func}acquisition_date_i%27}%20desc

URL params decoded:
q=title_t:*
fq={!parent which=doc_type_s:book}city_t:Innsbruck
sort={!parent which=doc_type_s:book score=max v='+doc_type_s:library +{!func}acquisition_date_i'}
desc

Result:
{
  "responseHeader":{
    "status":0,
    "QTime":4,
    "params":{
      "q":"title_t:*",
      "fq":"{!parent which=doc_type_s:book}city_t:Innsbruck",
      "sort":"{!parent which=doc_type_s:book score=max v='+doc_type_s:library +{!func}acquisition_date_i'}
desc"}},
  "response":{"numFound":2,"start":0,"docs":[
      {
        "doc_type_s":"book",
        "text":["book",
          "Mr. Mercedes",
          "Stephen King"],
        "id":"1000",
        "title_t":"Mr. Mercedes",
        "title_t_fac":"Mr. Mercedes",
        "autor_t":"Stephen King",
        "autor_t_fac":"Stephen King",
        "_version_":1591205521252155392},
      {
        "doc_type_s":"book",
        "text":["book",
          "Noah",
          "Sebastian Fitzek"],
        "id":"1001",
        "title_t":"Noah",
        "title_t_fac":"Noah",
        "autor_t":"Sebastian Fitzek",
        "autor_t_fac":"Sebastian Fitzek",
        "_version_":1591205521256349696}]
  }}

The result is wrong, because "Noah" should be before "Mr. Mercedes" in the list. The reason
is, i guess, because "Mr. Mercedes" has another child document with a newer acquisition_date.
But this child document is not in city "Innsbruck" and should not influence the sorting.

So i tried to add the city-filter to the sort-parameter as well in my second try:
-----

URL:
http://localhost:8983/solr/test1/select?q=title_t:*&fq={!parent%20which=doc_type_s:book}city_t:Innsbruck&sort={!parent%20which=doc_type_s:book%20score=max%20v=%27%2Bdoc_type_s:library%20%2Bcity_t:Innsbruck%20%2B{!func}acquisition_date_i%27}%20desc

URL params decoded:
q=title_t:*
fq={!parent which=doc_type_s:book}city_t:Innsbruck
sort={!parent which=doc_type_s:book score=max v='+doc_type_s:library +city_t:Innsbruck +{!func}acquisition_date_i'}
desc

(I added "+city_t:Innsbruck" to the sort param)

Result:
{
  "responseHeader":{
    "status":0,
    "QTime":3,
    "params":{
      "q":"title_t:*",
      "fq":"{!parent which=doc_type_s:book}city_t:Innsbruck",
      "sort":"{!parent which=doc_type_s:book score=max v='+doc_type_s:library +city_t:Innsbruck
+{!func}acquisition_date_i'} desc"}},
  "response":{"numFound":2,"start":0,"docs":[
      {
        "doc_type_s":"book",
        "text":["book",
          "Noah",
          "Sebastian Fitzek"],
        "id":"1001",
        "title_t":"Noah",
        "title_t_fac":"Noah",
        "autor_t":"Sebastian Fitzek",
        "autor_t_fac":"Sebastian Fitzek",
        "_version_":1591205521256349696},
      {
        "doc_type_s":"book",
        "text":["book",
          "Mr. Mercedes",
          "Stephen King"],
        "id":"1000",
        "title_t":"Mr. Mercedes",
        "title_t_fac":"Mr. Mercedes",
        "autor_t":"Stephen King",
        "autor_t_fac":"Stephen King",
        "_version_":1591205521252155392}]
  }}

Now the sorting is correct.

My question: 
Is there a way to achieve the same result without having add all filters to the search-param?

In other words: is there a way to sort on a child field, but only in matching child-documents?


Thanks for your help.

Florian

Mime
View raw message