2016-05-08 1 views
2

Ich habe diese Dokumente:Elasticsearch - kommen zwei verschiedene Arten von Dokumenten

myMovies

{ 
    "_index": "mymovies", 
    "_type": "mymovie", 
    "_id": "1", 
    "_score": 1, 
    "_source": { 
    "title" : "Funny title is here" 
    "genre" : "Comedy" 
    "movieViews" : 901142 
    } 
} 


{ 
     "_index": "mymovies", 
     "_type": "mymovie", 
     "_id": "2", 
     "_score": 1, 
     "_source": { 
     "title" : "Sad title is here" 
     "genre" : "Drama" 
     "movieViews" : 90 
     } 
} 

{ 
     "_index": "mymovies", 
     "_type": "mymovie", 
     "_id": "3", 
     "_score": 1, 
     "_source": { 
     "title" : "Sad Second title is here" 
     "genre" : "Drama" 
     "movieViews" : 9022 
     } 
} 

{ 
     "_index": "mymovies", 
     "_type": "mymovie", 
     "_id": "4", 
     "_score": 1, 
     "_source": { 
     "title" : "Horror title is here" 
     "genre" : "Horror" 
     "movieViews" : 9022 
     } 
} 

Benutzer

{ 
    "Name" : "Doni de brun", 
    "moviesLiked": [2,1,3]  
} 
  1. Wie ich nur Genres zu tun bekommen, dass ein bestimmter Benutzer mochte?

  2. Gibt es eine bessere Möglichkeit, die Daten für diese Abfrage zu organisieren?

Antwort

3

folgende Abfrage wird die Arbeit machen:

POST movies/_search 
{ 
    "size": 0 

    , "query": { 
    "terms": { 
     "_id": [2,1,3] 
    } 
    } 

    , "aggs": { 
    "genres_for_user": { 
     "terms": { 
     "field": "genre", 
     "size": 50 
     } 
    } 
    } 
} 

Ihre Dokumentstruktur sieht gut aus.

Stellen Sie sicher, dass Sie not_analyzed Index für Genre-Feld haben. Wenn Sie den Standardanalysator für dieses Feld beibehalten, werden Werte wie "Klassische Komödie" als zwei Schlüsselwörter indiziert, und in der Aggregationsabfrage werden zwei Zähler generiert, nämlich classic und Komödie.

1

Wie ich weiß, gibt es keine einfache Möglichkeit, Abfragen in Elasticsearch beizutreten. Aber Sie können Ihre Daten geschachtelt halten wie:

{ 
    "Name" : "Doni de brun", 
    "moviesLiked": [ 
     {  
      "title" : "Horror title is here", 
      "genre" : "Horror", 
      "movieViews" : 9022 
     }, 
     { 
      "title" : "Sad title is here", 
      "genre" : "Drama", 
      "movieViews" : 90 
     } 
    ]  
} 

Der Nachteil davon ist, müssen Sie Ihre Daten duplizieren. Aber man kann die Suche leicht tun Sie, indem Sie verschachtelte Abfragen möchten:

https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-query.html

+0

wenn ich orgnize Daten auf diese Weise bin - ein Film wird mehrfach in Daten angezeigt werden. Außerdem muss ich beim Aktualisieren eines Films alle Vorkommen suchen. – ohadinho

+1

Ja, das stimmt. Aber mit akzeptierter Antwort suchst du nur regelmäßig. Es hat nichts damit zu tun, Dokumente beizutreten. – alpert

+0

Sie richtig .. Ich habe einige Verwirrung mit "Join" Begriff gemacht. – ohadinho

Verwandte Themen