C# 如何在ElasticSearch中搜索使用嵌套的嵌套对象
我正在尝试使用NEST c#client搜索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
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")))
)))));