【问题标题】:Elasticsearch query to filter documents where value1 == value2 with Go olivere/elastic使用 Go Olivere/elastic 过滤 value1 == value2 的 Elasticsearch 查询
【发布时间】:2019-09-04 11:49:11
【问题描述】:

我需要构建查询以获取 doc.value1 == doc.value2 的文档

{
    "query": {
        "bool" : {
            "filter" : [{
                "script" : {
                    "script" : {
                        "source": "doc['val1'].value == doc['val2'].value",
                        "lang": "painless"
                     }
                }
            }]
        }
    }
}

这是我需要使用 Olivere/elastic 构建的,如果我将其作为 POST 请求发送,它就可以工作。

在 golang 我有类似的东西

"github.com/olivere/elastic"
...

query := elastic.NewBoolQuery()
// then add something to this query or leave it empty it works fine
// but if I add 
query = query.Filter(elastic.NewBoolQuery().Must(elastic.NewScript("doc.['val1'].value == doc.['val2'].value")))
// I'm getting: Error 400 (Bad Request): [source] query malformed,
// no start_object after query name [type=parsing_exception]

// Then i run it like:
client, err := elastic.NewClient()
if err != nil {
    fmt.Println(err)
    return
}
resp, err := client.Search("myIndex").Type("myDoc").Query(query).TrackTotalHits(true).Size(limit).Do(context.Background())
    if err != nil {
        fmt.Println(err)
        return
    }

【问题讨论】:

  • 你能把你在 ES 服务器日志中看到的错误显示出来吗?
  • 你能试试query = query.Filter(NewScriptQuery(NewScript("doc.['val1'].value == doc.['val2'].value1")))吗?
  • Val,如果我知道该怎么做,我会这样做的失败 [type=search_phase_execution_exception]
  • 您必须从该异常中分享更多信息,最好是来自 Elasticsearch 的堆栈跟踪,正如 @Val 所提到的。
  • ES 服务器日志位于 logs 文件夹中(如果您从 ZIP 或 tarball 安装)或 var/log/elasticsearch(如果您从 RPM/DEB 安装)。

标签: go elasticsearch


【解决方案1】:
query = query.Filter(elastic.NewScriptQuery(elastic.NewScript("doc['val1'].value == doc['val2'].value")))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 2018-02-13
    • 2023-04-05
    相关资源
    最近更新 更多