Elastic Search Retrieving Internals

I am using search with Scala and REST and have the following data structure: (as JSON input file)

{
    "bookTitle" : "textbook",
    "bookAuthors" : [
        {
            "authorId" : "01",
            "authorName" : "author1"
        },
        {
            "authorId" : "02",
            "authorName" : "author2"
        },
    ]
}

      

Data mappings used by this collection:

{
    "properties" : {
        "book": {
            "properties": {
                "bookTitle": {
                    "type": "string"
                }, 
                "bookAuthors": {
                    "type": "nested",
                    "properties": {
                        "authorId ": {
                            "type":"string"
                        },
                        "authorName" : {
                            "type": "string"
                        } 
                    }
                }
            }
        }
    }
}

      

I would like to be able to query for the author id and only get the single author that matches. So far I have managed to query for authorId, but I keep getting the whole book document with both authors being displayed; I also tried to select only the bookAuthors specific fields to be displayed, but the results were the same.

Current situation: get author name where authorId is 01 => returns [author1, author2]

Required query: get author name, where authorId - 01 => return [author1]

+3


source to share


1 answer


In elasticsearch 1.5.2 you could achieve this using internal hits

For example:

put mybooks
{
   "mappings": {
      "book": {
         "properties": {
            "bookTitle": {
               "type": "string"
            },
            "bookAuthors": {
               "type": "nested",
               "properties": {
                  "authorId ": {
                     "type": "string"
                  },
                  "authorName": {
                     "type": "string"
                  }
               }
            }
         }
      }
   }
}

      

2) Index documents

put mybooks/book/1
{
   "bookTitle": "book1",
   "bookAuthors": [
      {
         "authorId": "01",
         "authorName": "author1"
      },
      {
         "authorId": "02",
         "authorName": "author2"
      }
   ]
}

put mybooks/book/2
{
    "bookTitle" : "book2",
    "bookAuthors" : [
        {
            "authorId" : "03",
            "authorName" : "author1"
        },
        {
            "authorId" : "02",
            "authorName" : "author2"
        }
    ]
}

      



3) Request

post mybooks/_search
{
   "_source": [
      "bookTitle"
   ],
   "query": {
      "nested": {
         "path": "bookAuthors",
         "query": {
            "match": {
               "bookAuthors.authorId": "02"
            }
         },
         "inner_hits": {
             "_source" :["authorName"]
         }
      }
   }
}

      

4) Result

"hits": [
         {
            "_index": "mybooks",
            "_type": "book",
            "_id": "1",
            "_score": 1.4054651,
            "_source": {
               "bookTitle": "book1"
            },
            "inner_hits": {
               "bookAuthors": {
                  "hits": {
                     "total": 1,
                     "max_score": 1.4054651,
                     "hits": [
                        {
                           "_index": "mybooks",
                           "_type": "book",
                           "_id": "1",
                           "_nested": {
                              "field": "bookAuthors",
                              "offset": 1
                           },
                           "_score": 1.4054651,
                           "_source": {
                              "authorName": "author2"
                           }
                        }
                     ]
                  }
               }
            }
         },
         {
            "_index": "mybooks",
            "_type": "book",
            "_id": "2",
            "_score": 1.4054651,
            "_source": {
               "bookTitle": "book2"
            },
            "inner_hits": {
               "bookAuthors": {
                  "hits": {
                     "total": 1,
                     "max_score": 1.4054651,
                     "hits": [
                        {
                           "_index": "mybooks",
                           "_type": "book",
                           "_id": "2",
                           "_nested": {
                              "field": "bookAuthors",
                              "offset": 1
                           },
                           "_score": 1.4054651,
                           "_source": {
                              "authorName": "author2"
                           }
                        }
                     ]
                  }
               }
            }
         }
      ]

      

+3


source







All Articles