【问题标题】:elasticsearch dsl python : how to search by value inside arrayelasticsearch dsl python:如何按数组内的值搜索
【发布时间】:2019-10-28 14:39:36
【问题描述】:

我的索引中有以下结构:

[
    {
         name:"project1",
         users: [
                   {"id":"1"},
                   {"id":"2"}
         ]
    },
    #... more projects
]

我想知道如何获取特定用户的所有项目(通过他的 id),这是我尝试过的:

q = Q("term", id="1") 
resp = projects_index.query("nested",path="users",query=q).execute()

但我没有得到任何结果,我错过了什么?
谢谢
编辑 : 这是我的索引映射:

   {
      "projects": {
        "mappings": {
          "doc": {
            "properties": {
              "created_at": {
                "type": "date"
              },
              "name": {
                "type": "text"
              },
              "users": {
                "type": "nested",
                "properties": {
                  "id": {
                    "type": "text"
                  }
                }
              }
            }
          }
        }
      }
    }

【问题讨论】:

  • 添加索引的映射,方便大家更好地帮助你。
  • 感谢您的回答,但我不确定您所说的映射索引是什么意思?我已经给出了一个文档(或文档数组)的示例,每个归档的项目(文档)都有一个名称和一个用户列表
  • 使用它来获取映射:GET /<index>/_mapping。将 <index> 替换为您的索引名称。

标签: elasticsearch elasticsearch-dsl elasticsearch-dsl-py


【解决方案1】:

您没有得到结果的原因是,在指定嵌套路径时,您应该提供包括父字段名称在内的全名,即您应该使用users.id 而不仅仅是id。因此,查询将转换为如下:

{
  "query": {
    "bool": {
      "filter": [
        {
          "nested": {
            "path": "users",
            "query": {
              "term": {
                "users.id": "1"
              }
            }
          }
        }
      ]
    }
  }
}

建议:id字段的类型改为keyword,防止id值被tokenism分成多个term。

【讨论】:

  • 谢谢!对于 python elelasticsearch dsl 语法,它是 : __ 而不是 . : Q("term", users__id="id_looking_for")
猜你喜欢
  • 1970-01-01
  • 2021-07-17
  • 2021-12-13
  • 2021-08-27
  • 2019-02-09
  • 1970-01-01
  • 2021-11-27
  • 2011-09-21
  • 2018-07-05
相关资源
最近更新 更多