2014-06-27 6 views
0

Salut les amis s'il vous plaît aidez-moi ...Relations ElasticSearch

J'ai quelques doutes concernant les relations dans la recherche élastique.

Je vais vous expliquer mon doute avec l'exemple suivant

Étape 1: J'ai créé un index nommé "livres" à la recherche élastique

example.com:9200/books/

Étape 2: Ensuite, j'ai créé un type nommé « auteur » et les données insérées à elle

POST example.com:9200/books/author/1~~V~~singular~~3rd { "fname": "David", "lname": "Thomas" }

POST example.com:9200/books/author/2~~V~~singular~~3rd { "fname": "Hamton", "lname": "Vergo" }

Étape 3: a ensuite créé une correspondance pour un autre type 'authorbook' qui est l'enfant de l'auteur '

POST example.com:9200/books/authorbook/_mapping

{ "authorbook": { "_ parent": { "type": "auteur"}}}

Étape 4: Ensuite, j'ai inséré des données pour authorbook

POST example.com:9200 ?/livres/authorbook/100 parent = 1 { "bookname": "Bookname1" }

POST example.com:9200/books/authorbook/200?parent=1~~V~~singular~~3rd { "bookname": " Nom du livre2 " }

POST example.com:9200/books/authorbook/300?parent=2~~V~~singular~~3rd { "bookname": "Bookname3" }

étape: 5 Ensuite, j'ai créé un mappage pour un autre type nommé ' éditeur », un enfant de authorbook

POST example.com:9200/books/publisher/_mapping

{ "éditeur": { "_ parent": { "type": "authorbook"}}}

** Etape 6: Ensuite, j'ai inséré des données pour l'éditeur

POST example.com:9200/books/publisher/50?parent=200~~V~~singular~~3rd { "publname": "publisher1" }

POST example.com:9200/books/publisher/51?parent = 200 { "publname": "publisher2" }

POST example.com:9200/books/publisher/52?parent=100~~V~~singular~~3rd { "publname": "publisher3" }

Etape 7 maintenant, je l'ai obtenu à obtenir les détails de « authorbook » en utilisant une demande de poste avec le corps suivant

{ 
"query": { 
    "has_parent": { 
     "type": "author", 
     "query": { 
      "filtered": { 
       "query": { 
        "match_all": {} 
       }, 
       "filter": { 
        "or": [ 
         { 
          "term": { 
           "fname": "Hamton" 
          } 
         }, 
         { 
          "term": { 
           "fname": "David"  
          } 
         } 
        ] 
       } 
      } 
     } 
    } 
} 

} 

Mon exigence est d'obtenir l'unité centrale détails blisher aussi .. comment peut atteindre cela? pls aide ..

+0

Je ne pense pas qu'il soit possible de faire une requête récursive sur ES Vous devriez probablement faire cette première requête et utiliser la réponse retournée comme entrée d'une seconde requête. – Blblblblblblbl

Répondre

0

Essayez ceci:

{ 
"query": { 
    "constant_score": { 
     "filter": { 
      "or": [ 
        { 
         "has_parent": { 
          "type": "author", 
          "query": <your query above> 
        }, 
        { 
         "has_parent": { 
          "type": "author" 
          "query": { 
           "constant_score": { 
            "filter": { 
             "has_parent": { 
              "type": "authorbook", 
              "query": <some query you need for the publishers> 
             } 
            } 
           } 
          } 
         } 
        } 
       ] 
      } 
    } 
} 

Cela devrait vous revenir authorbooks et les éditeurs dans la même requête.

Premier conseil: si vous utilisez "query": {"match_all": {}} dans une filtered requête, vous pouvez aussi utiliser une requête à la place constant_score. Ensuite, il vous suffit de fournir le filtre.

Deuxième astuce: Lorsque l'indexation d'un petit-enfant comme publisher mieux vous fournir le paramètre de requête routing ainsi (qui devrait pointer vers l'id du author). Cela garantit que les enfants et les petits-enfants sont stockés dans le même fragment, ce qui accélère la recherche.

En général, je déconseille cependant une relation compliquée comme celle-ci. Vous pouvez voir que la requête est difficile à lire et très probablement difficile à déboguer plus tard. Peut-être que rester simple pourrait être une meilleure solution. Une autre idée est d'avoir authorbook (ou tout simplement book en tant que parent et publisher et author comme des enfants normaux (premier niveau) du book. La raison est que author et publisher ne sont pas liés, de sorte que vous n'avez pas réellement besoin de cette imbrication profonde.