使用 url enpoint 查询 api 中数组元素上的字符串

问题描述 投票:0回答:1

我正在使用芝加哥艺术学院 API (https://api.artic.edu/docs/#introduction),并且有一个名为 subject_titles 的元素,它是一个字符串数组。我想查询 API 以显示在 subject_titles 中包含字符串“landscapes”的所有结果,而不是抓取 API 并在我这边搜索该字符串。

我尝试过的一些失败的例子:

https://api.artic.edu/api/v1/artworks/search?q=[subject_titles]=landscapes

https://api.artic.edu/api/v1/artworks/search?query[terms][subject_titles]=landscape

我认为它将用不同的说明符替换“[terms]”,但我找不到哪个。我所有的研究都得出了使用 Elasticsearch API 的结果,但我对此还很陌生,这似乎是我不想打开的一罐蠕虫(为什么我需要一个 API 来查询另一个 API?还有 DSL)学习 synatx 看起来很头疼),但如果有必要的话我会学习的。有没有办法使用简单的 REST 风格 url 端点来做到这一点?

rest elasticsearch dsl
1个回答
1
投票

TL;博士:

https://api.artic.edu/api/v1/artworks/search?query[match][subject_titles]=landscape

如果你想要更详细的解释,我认为他们试图使界面强大而简洁,这样你就可以只用一个网址进行结构化查询,但我同意,这有点令人困惑。

看起来 URL 参数正在被转换为 DSL 中的顶级元素,如果值以

foo[bar]
之类的内容开头,它们将被转换为 foo 并嵌套在其中。所以如果你有
foo[bar][baz]=10
它将被翻译成

{
  "foo": {
    "bar": {
     "baz": 10
    }
  }
}

记住这些信息,我们可以对

query[term][is_public_domain]=true
进行逆向工程

{
  "query": {
    "term": {
      "is_public_domain": true
    }
  }
}

如果我们现在打开 elasticsearch 文档,我们可以发现

term
是查询的类型,并且此查询将搜索字段
is_public_domain
包含
true
的所有文档。我们需要搜索另一个字段和另一个值。因此,如果我们将
is_public_domain
替换为
subject_titles
,将
true
替换为
landscape
。术语适用于布尔字段,例如
is_public_domain
,但最好使用另一种查询类型 -
match
来搜索字符串。所以我们也应该用
term
替换
match
。最后我们会得到以下查询:

{
  "query": {
    "match": {
      "subject_titles": "landscape"
    }
  }
}

现在我们可以将其转换回 URL 表示形式:

query[match][subject_titles]=landscape
,如果我们将其贴回到我们得到的 URL 上

https://api.artic.edu/api/v1/artworks/search?query[match][subject_titles]=landscape

这将为我们提供前 10 个点击。如果我们想要更多,我们可以添加限制:

https://api.artic.edu/api/v1/artworks/search?query[match][subject_titles]=landscape&limit=100

如果我们想要更多,我们可以使用 page 参数开始对结果进行分页

https://api.artic.edu/api/v1/artworks/search?query[match][subject_titles]=landscape&limit=100&page=2

© www.soinside.com 2019 - 2024. All rights reserved.