Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ElasticSearch中搜索使用嵌套的嵌套对象_C#_.net_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Nested_Nest - Fatal编程技术网 elasticsearch,nested,nest,C#,.net,elasticsearch,Nested,Nest" /> elasticsearch,nested,nest,C#,.net,elasticsearch,Nested,Nest" />

C# 如何在ElasticSearch中搜索使用嵌套的嵌套对象

C# 如何在ElasticSearch中搜索使用嵌套的嵌套对象,c#,.net,elasticsearch,nested,nest,C#,.net,elasticsearch,Nested,Nest,我正在尝试使用NEST c#client搜索elasticsearch嵌套对象。 我的索引名是people,我的类型是person,其中car字段嵌套在中 这是我的班级: using Nest; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WebApplication5 { public class person { public int

我正在尝试使用NEST c#client搜索elasticsearch嵌套对象。 我的索引名是
people
,我的类型是
person
,其中
car
字段嵌套在

这是我的班级:

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; }
    }
}

} 
我的记录是这样的:

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"
   }
 ]
}
也就是说我有两张唱片

第二次更新
我尝试了这个查询,效果很好。虽然这不是我最后的问题

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":{}
    }
  }
 }
}
}
第三次更新
好的,在这种情况下,我的最终查询应该是:

{"_source":false,
"query": {
 "filtered": {
  "query": {"match_all": {}},
  "filter": {
    "nested": {
      "path": "car",
      "filter": {
        "term": {
          "car.carname": "audi"
        }
      }, 
      "inner_hits" : {}
    }
   }
  }
 }
}
如何在.net中编写此查询?
在这里,“\u源”和“内部\u命中”对我来说很重要,因为我只想返回匹配的嵌套文档,而不想返回其他内容(即,我只想返回匹配的嵌套文档,而不想返回其他嵌套文档)。
那么,你能帮我写下相应的搜索查询吗?
此外,我在这里匹配
car.carname
字段,但我希望我的应用程序能够匹配
car
字段的所有其他子字段,如
car.carno
car.color
,甚至匹配所有其他顶级字段,如
id
fname

第四次更新
这里,我在.net中为我在第三次更新中提到的最后一个查询编写了搜索查询(请查看我的第三次更新)。
你能检查一下它是否正确吗? 我在.net中编写的相应最终查询是:

(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"))))))));  

这是我通过研究您的查询所写的(Thanx为此做了很多:))。请检查一下,如果有什么问题请告诉我。但是是的,我仍然无法检索任何结果

尝试使用嵌套查询

为了测试目的,让我索引一些数据:

client.Index(new Person
{
    Id = 1, 
    Car = new List<NestedType> {new NestedType {Carname = "car1"}}
});
client.Index(new Person
{
    Id = 2,
    Car = new List<NestedType> {new NestedType {Carname = "car1"}, new NestedType {Carname = "car2"}}
});
client.Index(new Person
{
    Id = 3,
    Car = new List<NestedType> { new NestedType {Carname = "car2"}}
});

client.Refresh();
希望对你有帮助

更新

包括您的格式:

var searchResponse = client.Search<person>(s =>
    s.Query(q => q
        .Nested(n => n
            .Path(p => p.car)
            .Query(qq => qq.Match(m => m.OnField(f => f.car.First().carname).Query("car2"))))));
更新3

内部点击:

var searchResponse = client.Search<Person>(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)
            .Filter(filter => filter
                .And(
                    f1 => f1.Term(t => t.Car.First().Carname, "audi"),
                    f2 => f2.Term(t => t.Car.First().Color, "purple")))
            )))));
var searchResponse=client.Search(s=>s
.来源(假)
.Query(Query=>Query.Filtered(Filtered=>Filtered
.Query(q=>q.MatchAll())
.Filter(f=>f.Nested(nf=>nf
.InnerHits()
.Path(p=>p.Car)
.Filter(Filter=>Filter
.及(
f1=>f1.Term(t=>t.Car.First().Carname,“奥迪”),
f2=>f2.Term(t=>t.Car.First().Color,“紫色”))
)))));
注意:elasticsearch 1.5.0中有一个关于内部点击和过滤器的bug。
如果您需要检索内部点击的帮助,请告诉我。

…非常感谢您的回答。事实上,我的elasticsearch数据库中已经有记录了,所以我正在这些数据库中搜索。但是对于您给出的查询,我在第一行、第二行和第五行的“s”、“q”和“f”中分别出现了错误。其中表示“无法将lambda表达式分别转换为's'、'q'和'f'的'Nest.ISearchRequest'/'Nest.IQueryContainer'/'string'类型,因为它不是委托类型”。使用first()还有另一个错误。可能是因为我将属性调整为更多的“.Net方式”。试着用你的名字:车->车,卡纳姆->卡纳姆等。是的,我已经只用了我的名字。但问题是我现在没有得到任何错误,但是当我运行web应用程序并搜索carname字段中实际存在的值时,我得到的结果是零。我的类设计有什么问题吗?@aditianaya你可以分享索引映射,以及创建索引的代码吗?请检查我的更新。我已共享了我的索引映射和记录。:)是的,我的索引创建和记录插入是通过ElasticSearchHead插件完成的。
var searchResponse = client.Search<Person>(s =>
    s.Query(q => q
        .Nested(n => n
            .Path(p => p.Car)
            .Query(qq => qq.Match(m => m.OnField(f => f.Car.First().Carname).Query("car2"))))));
{
   "took": 10,
   "timed_out": false,
   "_shards": {..},
   "hits": {
      "total": 2,
      "max_score": 1.4054651,
      "hits": [
         {
            "_index": "my_index",
            "_type": "person",
            "_id": "2",
            "_score": 1.4054651,
            "_source": {
               "id": 2,
               "car": [
                  {
                     "carname": "car1",
                     "carNo": 0
                  },
                  {
                     "carname": "car2",
                     "carNo": 0
                  }
               ]
            }
         },
         {
            "_index": "my_index",
            "_type": "person",
            "_id": "3",
            "_score": 1,
            "_source": {
               "id": 3,
               "car": [
                  {
                     "carname": "car2",
                     "carNo": 0
                  }
               ]
            }
         }
      ]
   }
}
var searchResponse = client.Search<person>(s =>
    s.Query(q => q
        .Nested(n => n
            .Path(p => p.car)
            .Query(qq => qq.Match(m => m.OnField(f => f.car.First().carname).Query("car2"))))));
var searchResponse = client.Search<Person>(s => s
    .Query(query => query.Filtered(filtered => filtered
        .Query(q => q.MatchAll())
        .Filter(f => f.Nested(nf => nf
            .Path(p => p.Car)
            .Filter(filter => filter
                .And(
                    f1 => f1.Term(t => t.Car.First().Carname, "audi"),
                    f2 => f2.Term(t => t.Car.First().Color, "purple"))) 
            )))));
{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "nested": {
          "filter": {
            "and": {
              "filters": [
                {
                  "term": {
                    "car.carname": "audi"
                  }
                },
                {
                  "term": {
                    "car.color": "purple"
                  }
                }
              ]
            }
          },
          "path": "car"
        }
      }
    }
  }
}
var searchResponse = client.Search<Person>(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)
            .Filter(filter => filter
                .And(
                    f1 => f1.Term(t => t.Car.First().Carname, "audi"),
                    f2 => f2.Term(t => t.Car.First().Color, "purple")))
            )))));