如何使用Elasticsearch Query DSL来查询使用Python的API?

r7xajy2e  于 2023-01-04  发布在  ElasticSearch
关注(0)|答案(1)|浏览(240)

我正在尝试查询公共的芝加哥艺术学院API,以便只显示符合特定条件的结果。例如:

  • classification_title =“油漆”
  • colorfulness〈= 13
  • material_titles包括“纸(纤维制品)”

API文档规定:
在幕后,我们的搜索由Elasticsearch提供支持,你可以使用它的QueryDSL与我们的API交互。
除了一个标准之外,我不知道如何获取一个类似Elasticsearch DSL JSON的对象并将其传递到API URL中。
以下是一些特定于此API的单一标准示例:

requests.get("https://api.artic.edu/api/v1/artworks/search?q=woodblock[classification_title]").json()
requests.get("https://api.artic.edu/api/v1/artworks/search?q=monet[artist_title]").json()

这里是我的一些失败的尝试,有返回只有项目,通过2+标准项目:

requests.get("https://api.artic.edu/api/v1/artworks/search?q=woodblock[classification_title]monet[artist_title]")
requests.get("https://api.artic.edu/api/v1/artworks/search?q=woodblock[classification_title],monet[artist_title]")
requests.get("https://api.artic.edu/api/v1/artworks/search?q=%2Bclassification_title%3A(woodblock)+%2Bartist_title%3A(monet)")

最后,我尝试返回一些更复杂的条件,例如range,但失败了:

requests.get("https://api.artic.edu/api/v1/artworks/search?q={range:lte:10}&query[colorfulness]").json()
requests.get("https://api.artic.edu/api/v1/artworks/search?q=<10&query[colorfulness]").json()
requests.get("https://api.artic.edu/api/v1/artworks/search?q=%2Bdate_display%3A%3C1900").json()

所有这些失败的尝试都返回了数据,但不在我通过的标准范围内。例如,woodblock[classification_title]monet[artist_title]应该不返回任何结果。
我如何查询所有这些条件,只返回符合所有这些条件的结果(如果有的话)呢?类似JSON的Query DSL似乎与requests.get不兼容。

vpfxa7rd

vpfxa7rd1#

解决了,我对GETPOST的知识比较欠缺,我确实可以使用类似JSON的Query DSL,只需要将它作为requests.post的一部分而不是requests.get发送,如下所示:

import requests

fields = "id,image_id,title,artist_id,classification_title,colorfulness,material_titles"
url = f"https://api.artic.edu/api/v1/artworks/search?&fields={fields}"

criteria = {
    "query": {
        "bool": {
            "must": [
                {"match": {"classification_title": "painting"}},
                {"range": {"colorfulness": {"lte": 13}}},
                {"match": {"material_titles": "paper (fiber product)"}},
            ],
        }
    }
}

r = requests.post(url, json=criteria)
art = r.json()
print(art)

注意,在requests.post中,所需的条件查询作为json参数传递,与url分开。

相关问题