gpt4 book ai didi

c# - ElasticSearch:查询作为对象数组的字段

转载 作者:太空狗 更新时间:2023-10-30 00:39:55 24 4
gpt4 key购买 nike

我使用 ElasticSearch 为数据编制了索引,但我在查询特定字段时遇到了问题。 JSON 片段如下:

 {
"_index": "indexName",
"_type": "type",
"_id": "00001",
"color": "red",
"place": "london",
"person": [
{
"name": "john",
"friends": [
"mary",
"jane"
]
}
{
"name": "jack",
"friends": [
"lisa",
"alex"
]
}

]
}

我需要查询索引并找出 person 中的 name 之一是“john”的所有记录。

我正在使用 Client.Search 来执行此操作,并且我可以通过以下方式查询未嵌套的字段(如 color):

 var searchResults = client.Search<People>(s => s
.Index("indexName")
.Type("type")
.Query(q => q
.Bool(b => b
.Must(
x => x.Match(m => m.OnField(p => p.color).Query("red")),
x => x.Match(m => m.OnField(p => p.place).Query("london"))))));

我有 People 定义如下:

public class People
{
public string color {get; set; }
public string place {get; set; }
public List<Person> person {get; set; }
}
public class Person
{
public string name {get; set; }
// "friends" isn't here as I don't pull data from it
}

我不确定如何查询 name,因为它在“内部”people - 非常感谢任何帮助。

最佳答案

您需要将查询包装在 nested_query 中才能访问嵌套字段。

{
"nested" : {
"path" : "person",
"query" : {
"match" : {"person.name" : "john"}
}
}
}

摘自documentation :

The query is executed against the nested objects / docs as if they were indexed as separate docs (they are, internally) and resulting in the root parent doc (or parent nested mapping).

基本上,内部嵌套的字段作为单独的文档存储在原始文档附近(因此它们可以快速获取)。默认情况下 elastic 不会加载它们,所以你需要明确地告诉他你想要访问它。你可以说嵌套字段是惰性的 ;)

抱歉,我已经有很长时间没有在 .Net 和 Linq 上工作了。不知道API。但是您需要创建类似的东西。

编辑。来自 github source和你的代码,我认为你需要:

var s = new SearchDescriptor<People>()
.Query(ff=>ff
.Nested(n=>n
.Path(f=>f.person[0])
.Query(q=>q.Term(f=>f.person[0].name,"john"))
)
);

编辑2.你试过直接 curl 到服务器吗?或者尝试在 head 插件中查询?像这样的东西:

curl -XPOST 'http://localhost:9202/indexName' -d '
{
"query": {
"nested": {
"path": "person",
"query": {
"query_string": {
"query": "person.name: john"
}
}
}
}
}'

这适用于我的集群(更改了列名)。

关于c# - ElasticSearch:查询作为对象数组的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32358581/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com