【问题标题】:Elasticsearch Go nested queryElasticsearch Go 嵌套查询
【发布时间】:2018-03-08 02:34:06
【问题描述】:

我正在使用 Olivere 的弹性 Go 库来运行弹性查询 - https://godoc.org/github.com/olivere/elastic#NestedQuery

我尝试查询的数据如下所示:

                "_source": {
                    "field1": "randVal1",
                    "field2": "randVal2",
                    "nestedfield": {
                        "ind1": "val1"
                    }
                }

我正在尝试使用 Elastic Go 库中的 NestedQuery 调用对 nestedfield 运行查询,如下所示:

aquery := elastic.NewTermQuery("ind1", "val1")
query := elastic.NestedQuery("nestedfield", aquery)

但我收到一条错误消息:

转换为 NestedQuery 的参数过多

我正在尝试检索nestedfield 的ind1 为val1 的所有文档。非常感谢您在构建此查询时提供的任何帮助。

编辑:

我将其更改为 NewNestedQuery,现在它没有给出该错误。但是,它没有返回任何结果,即使该文档存在于索引中并且我能够查询非嵌套字段。

我试过了:

aquery := elastic.NewTermQuery("ind1", "val1")
query := elastic.NewNestedQuery("nestedfield", aquery)

还有这个:

query := elastic.NewNestedQuery("nestedfield", elastic.NewMatchQuery("nestedfield.ind1", "val1"))

但他们都给出了 0 个结果。知道我做错了什么吗?

编辑#2

映射为:

"field1": { "type": "string" },
"field2": { "type": "string" },
"nestedfield": {
                    "type": "nested"
                }

最终奏效的是:

query := elastic.NewMatchQuery("nestedfield.ind1", "val1")

我能够向“nestedfield”添加其他字段并进行如下查询:

query := elastic.NewBoolQuery().Filter(elastic.NewMatchQuery("nestedfield.ind1", "val1"), elastic.NewMatchQuery("nestedfield.ind2", "val2"))

【问题讨论】:

  • 分享您的映射。我怀疑“nestedfield”实际上不是嵌套文档。
  • 我在下面调整了答案,但您应该尝试提供更多用于搜索的完整代码的详细信息。
  • 共享映射以及最终的工作原理

标签: elasticsearch go elasticsearch-plugin elasticsearch-query


【解决方案1】:

看起来应该是:

q := elastic.NewTermQuery("nestedfield.ind1", value)
nq := elastic.NewNestedQuery("nestedfield", q)
  • NestedQuery 是一种类型,而不是函数。
  • NewTermQuery 需要一个 来自 json 的值,而不是 const 字符串
  • 您需要解析源 json 以从 ind1 获取值

根据下面的 cmets 进行了编辑以修复 NewTermQuery。如果这仍然不起作用,请提供您用于解析源代码并获取错误的完整代码,因为您在这里没有提供足够的细节来猜测问题。

【讨论】:

  • 我试过了,错误消失了,但没有返回任何结果。我编辑了问题以添加更多详细信息
  • "ind1" 应该是"nestedfield.ind1"
  • 我相信 Val 的意思是 aquery := elastic.NewTermQuery("nestedfield.ind1", val1)
  • 谢谢 Val,Pandawan,我认为你是对的。很抱歉修改被拒绝。
  • 我可以使用elastic.NewMatchQuery("nestedfield.ind1", "val1") 来获得结果。我想知道为什么 NewNestedQuery 和 NewTermQuery 组合不起作用:/
猜你喜欢
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 2016-03-28
  • 1970-01-01
相关资源
最近更新 更多