Gewusst wie: suchen in ElasticSearch verschachtelte Objekte mit NEST

Ich versuche, mit meiner Suche elasticsearch verschachtelten Objekten durch die Verwendung NEST c# - client.
Meine index-name people und mein Typ ist person in denen die car Feld ist nested.

Das ist meine Klasse:

using Nest;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WebApplication5
{
public class person
{
    public int id { get; set; }
    public String fname  { get; set; }
    public String mname { get; set; }
    public String lname { get; set; }
    public String houseno { get; set; }
    [ElasticProperty(Type = FieldType.Nested)]
    public IList<NestedType> car { get; set; } 
    public class NestedType
    {
        public String carname { get; set; }
        public int car_no { get; set; }
        public String color { get; set; }
    }
}

} 

Nun meine web-Anwendung sieht etwa so aus:

using Elasticsearch.Net;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Configuration;
using Nest;
using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication5
{
public partial class WebForm1 : System.Web.UI.Page
{
    Stopwatch stopwatch = new Stopwatch();
    Uri node;
    ConnectionSettings settings;
    ElasticClient client;
    IList<person> list;
    protected void Page_Load(object sender, EventArgs e)
    {
        node = new Uri("http://localhost:9200");
        settings = new ConnectionSettings(node, defaultIndex:   "people");
        client = new ElasticClient(settings);
        list = new List<person>();

    }

    public IList<person> Search(ref long totalResult, int from,  int size, string searchKeyword)
    {
        list.Clear();
        stopwatch.Start();

        try
        {

            var result = client.Search<person> /*   */


  stopwatch.Start();
  totalResult = result.Total;
  list = result.Hits.Select(t => t.Source).ToList<person>();
  }
        catch (Exception ex)
        {
            string msg = ex.Message;
        }
 return 
            list;
    }
 protected void TextBox1_TextChanged(object sender, EventArgs e)
    {
        long totalResult = 0;
        IList<person> List = new List<person>();
        List = Search(ref totalResult, 0, 1000,TextBox1.Text);
        Label1.Text = "" + List.Count + " result(s)"+ " in "+ stopwatch.Elapsed.TotalSeconds+"seconds";
        GridView1.DataSource = List;
        GridView1.DataBind();
        List.Clear();

    }
  }
}

Hier searchKeyword ist das das Wort, dass ich Suche.

Ich geben Sie ihn in das Suchfeld(webform) in den browser.

Die searchKeyword kann beliebigen Wert enthalten, der die Bedürfnisse aufeinander abgestimmt werden, um den Wert für jedes Feld in meiner Tabelle person.

Wenn die searchKeyword Spiele mit einer verschachtelten Dokument dann die genaue verschachtelten Dokument zurückgegeben werden soll.

Ich weiß nicht, es ist etwas falsch mit meinem geschachtelte Abfrage, oder ich tatsächlich nicht herausfinden können, wie man verwenden Sie eine verschachtelte Abfrage, um dies zu tun. Jedesmal, wenn ich die Anwendung ausführen und suchen Sie nach einem Wert, der tatsächlich in der Tabelle vorhanden sind,bekomme ich null Ergebnisse. Bitte helfen Sie mir herauszufinden, wie man die query Suche im geschachtelte Felder und helfen Sie mir bei der Kontrolle, wenn ich geschrieben habe, die class richtig.
Der query-Teil der Markiert ist als /* */.
Kann mir jemand helfen, dieses Problem lösen?

UPDATE
Dies ist meine index-Zuordnung :

POST- people/person/_mapping
{
"person":{
"properties":{
  "car": {
    "type": "nested"
    }
  }
 }
}

Und meine Einträge so Aussehen:

POST-people/person
{
"id":1, 
"fname":"aditi",  
"mname":"ananya", 
"lname":"xyz", 
"houseno":"abc",
"car":
 [
  {
   "carname":"fiat",
   "carno":1234,
   "color":"white"
  },

  {
   "carname":"maruti",
   "carno":5678,
   "color":"silver"
  }
 ]
}


POST-people/person
{
"id":2, 
"fname":"robin",  
"mname":"kumar", 
"lname":"sharma", 
"houseno":"efg",
"car":
  [
   {
      "carname":"audi",
      "carno":4321,
      "color":"black"
   },

   {
      "carname":"honda",
      "carno":8765,
      "color":"red"
   },

   {
      "carname":"merecedez",
      "carno":0101,
      "color":"purple"
   }
 ]
}

Was bedeutet, ich habe 2 Platten.

ZWEITE UPDATE

Ich habe versucht, diese Abfrage und es funktioniert gut. Obwohl dies nicht meine Letzte Abfrage aus.

POST-people/person/_search
{
"_source":false,
"query": {
"filtered": {
  "query": {"match_all": {}},
  "filter": {
    "nested": {
      "path": "car",
      "query":{
        "filtered": {
          "query": { "match_all": {}},
          "filter": {
            "and": [
              {"term": {"car.carname":"mercedez"}},
              {"term": {"car.color":"purple"}}
            ]
          }
        }
      },
"inner_hits":{}
    }
  }
 }
}
}

DRITTE UPDATE

Ok, also jetzt In diesem Fall meine Letzte Abfrage :

{"_source":false,
"query": {
 "filtered": {
  "query": {"match_all": {}},
  "filter": {
    "nested": {
      "path": "car",
      "filter": {
        "term": {
          "car.carname": "audi"
        }
      }, 
      "inner_hits" : {}
    }
   }
  }
 }
}

Wie Schreibe ich diese Abfrage in .net?

Hier die "_source" und "inner_hits" sind wichtig für mich, denn ich will wieder nur die passenden verschachtelten Dokument und sonst nichts(d.h. ich will nur die Rückkehr abgestimmt verschachtelten Dokument und nicht die anderen geschachtelten Dokumenten).

Also, können Sie bitte mir helfen, schreiben Sie die entsprechende Suchanfrage für diese?

Außerdem, hier bin ich-matching in der car.carname Bereich, aber ich möchte meine Anwendung sollte in der Lage sein zu entsprechen, für alle anderen sub-Felder der car Feld wie car.carno und car.color und auch für alle anderen top-level-Bereichen wie id, fname etc.

VIERTE UPDATE

Hier habe ich geschrieben, das die Suche im .net für meine Letzte Abfrage, die ich erwähnt hatte, meine DRITTE UPDATE (bitte schauen Sie in meinem Dritten update).

Können Sie bitte überprüfen, ob es richtig ist?
Die entsprechenden endgültigen Abfrage in .net was ich geschrieben habe ist:

(s => s
 .Source(false)
   .Query(query => query.Filtered(filtered => filtered
    .Query(q => q.MatchAll())
      .Filter(f => f.Nested(nf => nf
        .InnerHits()
        .Path(p => p.car)
        .Query(qq => qq.Match(m => m.OnField(g=>g.car.First().carname).Query("audi"))))))));  

Dies ist, was ich geschrieben habe, durch das Studium Ihrer Anfragen(vielen Dank dafür 🙂 ). Tun Sie dies überprüfen und mir sagen, ob es etwas falsch. Aber ja,ich bin noch nicht in der Lage das abrufen von Ergebnissen.

InformationsquelleAutor Aditi Ananya | 2015-06-23
Schreibe einen Kommentar