我已经使用ElasticSearch索引了数据,但在查询特定字段时遇到了麻烦。 JSON的片段如下:
{
"_index": "indexName",
"_type": "type",
"_id": "00001",
"color": "red",
"place": "london",
"person": [
{
"name": "john",
"friends": [
"mary",
"jane"
]
}
{
"name": "jack",
"friends": [
"lisa",
"alex"
]
}
]
}
我需要查询索引并挑选出
name
中的person
之一是“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的摘录:
基本上,内部嵌套的字段将作为单独的文档存储在附近(以便快速提取)原始文档。默认情况下,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 服务器?还是尝试在头插件中查询?就像是:
curl -XPOST 'http://localhost:9202/indexName' -d '
{
"query": {
"nested": {
"path": "person",
"query": {
"query_string": {
"query": "person.name: john"
}
}
}
}
}'
这适用于我的集群(列名已更改)。