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

kxe2p93d  于 7个月前  发布在  ElasticSearch
关注(0)|答案(1)|浏览(63)

我使用的是Art Institute of芝加哥API(https://api.artic.edu/docs/#introduction),其中有一个名为subject_titles的元素,它是一个字符串数组。我想查询API,以显示所有在subject_titles中包含字符串“landscapes”的结果,而不是在我这端抓取API并搜索字符串。
以下是我尝试过的一些失败的例子:
第一个月
https://api.artic.edu/api/v1/artworks/search?query[terms][subject_titles]=landscape
我估计它会用一个不同的指定符来替换“[terms]”,但我找不到具体的指定符。我所有的研究都得出了使用Elasticsearch API的结果,但我对这个很陌生,这似乎是一个我不想打开的蠕虫罐头(为什么我需要一个API来查询另一个API?另外,DSL看起来像是学习synatx-wise的一个头痛问题,但如果我必须学习它,我会学习它。

goqiplq2

goqiplq21#

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

如果你想要一个更详细的解释,我认为他们试图使界面强大和简洁,所以你可以做结构化查询只与一个网址,但我同意,这是有点混乱。
看起来URL参数被转换成DSL中的顶级元素,如果值以foo[bar]开头,它们被转换成foo,里面嵌套了bar。

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

字符串
记住这些信息,我们可以将query[term][is_public_domain]=true逆向工程为

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


如果我们现在打开elasticsearch documentation,我们可以发现term是查询的类型,这个查询将搜索所有字段is_public_domain包含true的文档。我们需要搜索另一个字段和另一个值。所以,如果我们将is_public_domain替换为subject_titles,将true替换为landscape,Term对于布尔型字段(如is_public_domain)效果很好,但最好用另一种查询类型搜索字符串-match。所以我们也应该用match替换term。最后我们会得到以下查询:

{
  "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

相关问题