我正在尝试从存储在elasticsearch中的JSON数组中获取一个对象。布局是这样的:
[
object{}
object{}
object{}
]
当我进行搜索并且它命中这些对象之一时,我需要什么来获取它匹配的特定对象。目前,我正在使用 java API 进行搜索:
QueryBuilder qb = QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("text", "pottery").boost(5)
.minimumShouldMatch("1"));
SearchResponse response = client.prepareSearch("stuff")
.setTypes("things")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(qb)
.setPostFilter(filter)//.setHighlighterQuery(qb)
.addField("places.numbers")
.addField("name")
.addField("city")
.setFrom(0).setSize(60).setExplain(true)
.execute()
.actionGet();
但这只会返回我击中的整个对象,或者当我告诉它返回字段“places.numbers”时,它只会返回“palces”数组中的第一个对象,而不是在查询。
感谢您的帮助!
最佳答案
有几种方法可以处理这个问题。我可能会用nested type来做到这一点和 inner hits ,鉴于您在问题中所显示的内容,但也可以使用 parent/child relationship 来完成.
这是一个带有嵌套文档的示例。我设置了一个像这样的简单索引:
PUT /test_index
{
"mappings": {
"parent_doc": {
"properties": {
"parent_name": {
"type": "string"
},
"nested_docs": {
"type": "nested",
"properties": {
"nested_name": {
"type": "string"
}
}
}
}
}
}
}
然后添加了几个简单的文档:
POST /test_index/parent_doc/_bulk
{"index":{"_id":1}}
{"parent_name":"p1","nested_docs":[{"nested_name":"n1"},{"nested_name":"n2"}]}
{"index":{"_id":2}}
{"parent_name":"p2","nested_docs":[{"nested_name":"n3"},{"nested_name":"n4"}]}
现在我可以使用 "inner_hits"
像这样搜索:
POST /test_index/_search
{
"query": {
"nested": {
"path": "nested_docs",
"query": {
"match": {
"nested_docs.nested_name": "n3"
}
},
"inner_hits" : {}
}
}
}
返回:
{
"took": 4,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 2.098612,
"hits": [
{
"_index": "test_index",
"_type": "parent_doc",
"_id": "2",
"_score": 2.098612,
"_source": {
"parent_name": "p2",
"nested_docs": [
{
"nested_name": "n3"
},
{
"nested_name": "n4"
}
]
},
"inner_hits": {
"nested_docs": {
"hits": {
"total": 1,
"max_score": 2.098612,
"hits": [
{
"_index": "test_index",
"_type": "parent_doc",
"_id": "2",
"_nested": {
"field": "nested_docs",
"offset": 0
},
"_score": 2.098612,
"_source": {
"nested_name": "n3"
}
}
]
}
}
}
}
]
}
}
这是我用来测试它的代码:
http://sense.qbox.io/gist/ef7debf436fec2a10097ba2106d5ff30ff8d7c77
关于arrays - 在 Elasticsearch 中搜索数组时获取对象命中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32481712/