arrays - 在 Elasticsearch 中搜索数组时获取对象命中

标签 arrays search elasticsearch json java

我正在尝试从存储在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/

相关文章:

mysql - 在mysql中使用单个where条件和单个关键字搜索表的所有列

php - 为什么我的 php 数组作为对象保存到 MongoDB,然后作为带有字符串化键的关联数组进行检索?

api - YouTube API搜索第3版-开始索引?

python - 用于文本的简单过滤器 Python 脚本

elasticsearch - NoRouteToHostException:在集群上运行Elasticsearch时没有路由到主机错误

elasticsearch - Elasticsearch:复合聚合支持最小文档数过滤器吗?

c++ - 将数据从数组复制到 vector C++ C99

javascript - 如何通过索引数组重新排列数组(证明)?

python - 以下哪项是在 Python 中检查列表是否为空的最快方法?

lucene - 带有停用词的模糊搜索在Lucene/ElasticSearch中产生意外结果