【问题标题】:How can you sort documents by nested object in elastic search using go?如何使用 go 在弹性搜索中按嵌套对象对文档进行排序?
【发布时间】:2018-11-14 03:26:30
【问题描述】:

我是 Elasticsearch 的新手。

我有文档,每个文档都有这样的结构:

{
    "created_at": "2018-01-01 01:01:01",
    "student": {
        "first_name": "john",
        "last_name": "doe"
    },
    "parent": {
        "first_name": "susan",
        "last_name": "smile"
    }
}

我只想根据student.first_name 使用olivere/elastic 包为go 对这些文档进行排序。

这是我目前的查询:

searchSvc = searchSvc.SortBy(elastic.NewFieldSort("student.first_name").Asc())

我收到了这个错误:

弹性:错误 400(错误请求):所有分片均失败 [type=search_phase_execution_exception]

但是,当我尝试按 created_at 对其进行排序时,它可以正常工作。

searchSvc = searchSvc.SortBy(elastic.NewFieldSort("created_at").Asc())

我在索引中没有任何映射。 (这是问题吗?)

我尝试搜索“Elasticsearch 按嵌套对象排序”之类的内容,但总是遇到需要对嵌套对象中的数组进行排序的问题。

【问题讨论】:

  • 在我看来student 是一个数组。我不熟悉 go,但是是否有数组访问运算符 [] 或类似的,例如您可能在 C 或 php 等中找到的?
  • student 不是一个数组。它只是一个对象

标签: elasticsearch go


【解决方案1】:

事实证明这是一个初学者的错误。你不能按文本字段排序。我从这里得到它elasticsearch-dsl-py Sorting by Text() field

你可以做什么,如果你不指定映射,你可以按字段的关键字属性排序。

searchSvc = searchSvc.SortBy(elastic.NewFieldSort("student.first_name.keyword").Asc())

它有效!

【讨论】:

  • 关键字字段需要在字段的映射中设置(除非它是一个动态文本字段,其中 elastic 生成带有 'keyword' 字段的映射并将其限制为 256 个字符,或类似的东西)。您无法在没有关键字字段或 fielddata=true 的情况下对简单文本字段进行排序的原因是因为它不是 doc_value 类型的字段,并且其索引值是从标准文本分析器生成的(例如具有多个单词的数组)而不是单个值。
  • @NiritLevi 是的!非常感谢!我需要深入研究 Elasticsearch 的文档!
猜你喜欢
  • 2021-11-19
  • 2022-07-11
  • 1970-01-01
  • 2013-11-05
  • 2018-07-02
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多