当前位置: 首页 > 知识库问答 >
问题:

在匹配嵌套/内部对象中的字段时连接elasticsearch索引

厍建义
2023-03-14

我试图通过使用术语筛选查找加入2个弹性搜索索引。我查阅了http://www.elasticsearch.org/blog/terms-filter-lookup/和http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-terms-filter.html。这些示例查找像“followers”这样的字段数组:[“1”,“3”]和join对于类似的数据很好。

我的要求是与对象数组中的字段联接。当我扩展上面的示例以包括一个对象数组时,我的查询失败了。以下是示例数据:

PUT /users/user/2 {
   "followers" : [
  {
    "userId":"1",
    "username":"abc",
    "location":"xyz"
   },
   {
    "userId":"3",
    "username":"def",
    "location":"xyz"
   }
}
]
}

PUT /tweets/tweet/1 {
   "user" : "2"
}

PUT /tweets/tweet/2 {
   "user" : "1"
}

我现在试图找到由用户2的追随者创建的推文

POST /tweets/_search {
  "query" : {
"filtered" : {
  "filter" : {
    "terms" : {
      "user" : {
        "index" : "users",
        "type" : "user",
        "id" : "2",
        "path" : "followers.userId"
      },
      "_cache_key" : "user_2_friends"
    }
  }
}
  }
}

以上查询的搜索结果为0。我还尝试了另外两种方法:1)在映射期间将followers对象声明为嵌套对象,并在查询中使用“nested”;2)在将路径指定为“followers”之后,尝试为followers.userid添加一个匹配查询。

术语筛选器查找支持对象数组吗?任何解决我问题的建议都将大有帮助

共有1个答案

齐英耀
2023-03-14

你想做的对我有用,除非我错过了什么。您使用的是哪个版本的Elasticsearch?我用的是1.3.4。

因此,我创建了两个索引,并添加了您列出的文档:

curl -XPUT "http://localhost:9200/users"

curl -XPUT "http://localhost:9200/users/user/2 " -d '
{
   "followers" : [
  {
    "userId":"1",
    "username":"abc",
    "location":"xyz"
   },
   {
    "userId":"3",
    "username":"def",
    "location":"xyz"
   }
   ]
}'

curl -XPUT "http://localhost:9200/tweets"

curl -XPUT "http://localhost:9200/tweets/tweet/1 " -d'
{
   "user" : "2"
}'

curl -XPUT "http://localhost:9200/tweets/tweet/2 " -d'
{
   "user" : "1"
}'

然后运行搜索查询:

curl -XPOST "http://localhost:9200/tweets/_search " -d'
{
   "query": {
      "filtered": {
         "filter": {
            "terms": {
               "user": {
                  "index": "users",
                  "type": "user",
                  "id": "2",
                  "path": "followers.userId"
               },
               "_cache_key": "user_2_friends"
            }
         }
      }
   }
}'

得到了这个结果:

{
   "took": 2,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 1,
      "max_score": 1,
      "hits": [
         {
            "_index": "tweets",
            "_type": "tweet",
            "_id": "2",
            "_score": 1,
            "_source": {
               "user": "1"
            }
         }
      ]
   }
}

下面是我使用的代码:

http://sense.qbox.io/gist/4A2A2D77D0B6F4502FF6C5022B268ACFA65EE6D2

 类似资料:
  • 问题内容: 我正在尝试通过使用术语过滤器查找来加入2个Elasticsearch索引。我提到了http://www.elasticsearch.org/blog/terms- filter-lookup/ 和http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query- dsl-terms-filter。 h

  • 该示例摘自Elasticsearch参考:https://www.elastic.co/guide/en/Elasticsearch/reference/5.3/nested.html 我的索引和这个差不多。唯一的区别是user.first和user.last是关键字类型,所以我可以对它们使用过滤器。 在两种情况下,我应该使用什么查询来获取与上面数组匹配的文档(正好是两个项,一个项是John Sm

  • 问题内容: 这是我的文档架构。是嵌套对象。我需要更新/删除其中的特定文件。我能够使用groovy脚本更新字段。 但是不知道如何更新嵌套对象。 例如,我想将此添加到中。 并且我的文档应更改为: 如果我基于= 122 执行删除,则我的记录应如下所示 问题答案: 要将新元素添加到嵌套字段,您可以像这样进行操作: 要从嵌套字段列表中删除现有元素,可以按以下步骤进行:

  • null 当然有更好的方法吗?

  • 我只需要对与查询匹配的嵌套对象上的值求和。看起来ElasticSearch确定与查询匹配的文档,然后对所有嵌套对象求和。从下面的大纲中,我想搜索嵌套对象。objtype=“A”并返回objvalue之和,仅用于匹配嵌套对象,我想得到值4。这可能吗?如果是,如何? 这是地图 这是我的文件 这是我的查询代码。

  • 假设我有以下文件: 我只想在搜索响应中获得与所有顶级字段匹配的嵌套对象。我的意思是,如果我搜索/筛选名为“abc”的用户,我希望下面的响应 我怎么能那么做? 参考:在elasticsearch中从数组中选择匹配的对象