2017-07-17 8 views
0

Ich verwende Elasticsearch 5.5.0.Wie Abfrage Array von Objekten als Teil der Begriff Abfrage

Im meinem Index Ich habe Daten vom Typ Attraktion Teil des json in elastischen sehen aus wie:

"directions": "Exit the M4 at Junction 1", 
     "phoneNumber": "03333212001", 
     "website": "https://www.londoneye.com/", 
     "postCode": "SE1 7PB", 
     "categories": [ 
     { 
      "id": "ce4cf4d0-6ddd-49fd-a8fe-3cbf7be9b61d", 
      "name": "Theater" 
     }, 
     { 
      "id": "5fa1a3ce-fd5f-450f-92b7-2be6e3d0df90", 
      "name": "Family" 
     }, 
     { 
      "id": "ed492986-b8a7-43c3-be3d-b17c4055bfa0", 
      "name": "Outdoors" 
     } 
     ], 
     "genres": [], 
     "featuredImage": "https://www.daysoutguide.co.uk/media/1234/london-eye.jpg", 
     "images": [], 
     "region": "London", 

Meine nächste Abfrage wie folgt aussieht:

var query2 = Query<Attraction>.Bool(
      bq => bq.Filter(
       fq => fq.Terms(t => t.Field(f => f.Region).Terms(request.Region.ToLower())), 
       fq => fq.Terms(t => t.Field(f => f.Categories).Terms(request.Category.ToLower()))) 

Die Abfrage sieht erzeugt wie:

{ 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "terms": { 
      "region": [ 
       "london" 
      ] 
      } 
     }, 
     { 
      "terms": { 
      "categories": [ 
       "family" 
      ] 
      } 
     } 
     ] 
    } 
    } 
} 

Das gibt keine Ergebnisse zurück. Wenn ich die Kategorien herausbreche, bekomme ich Ergebnisse. Also versuche ich, einen Termfilter auf Kategorien anzuwenden, der ein Array von Objekten ist. Sieht so aus, als würde ich diese Anfrage falsch machen. Irgendwelche Hinweise, wie man das zur Arbeit bringt?

Grüße

Ismail

+1

Ich denke, Sie möchten den vollständigen Pfad des Feldes angeben: 'categories.name'. Das sollte funktionieren. – Slomo

+0

Sie sollten eine verschachtelte Abfrage verwenden, Sie finden die Verwendung in [docs] (https://www.elastic.co/guide/en/elasticsearch/client/net-api/5.x/nested-query-usage.html) . – Rob

+0

rob, nicht sicher, wie du das mit dem Nest Client machst? Ich weiß, wie man mit DSL macht – Ismail

Antwort

2

Sie können nach wie vor stark typisierten Eigenschaften Zugriff verwenden, indem Sie mit:

t.Field(f => f.Categories.First().Name)

NEST ‚s-Eigenschaft Inferenzeinheit Leser lesen über .First() und categories.name ergeben.

t.Field(f => f.Categories[0].Name) funktioniert auch.

Verwandte Themen