我正在使用芝加哥艺术学院 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 端点来做到这一点?
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