elasticsearch 多查询参数前端调用弹性查询

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

API用法:

我正在使用一个公共API在前端显示艺术品。公共API url:https://api.artic.edu/api/v1/artworks/search

单独工作的场景

要过滤包含place_of_origin=France的艺术品,我可以使用以下查询(100%有效):https://api.artic.edu/api/v1/artworks/search?fields=id,api_link,title,description,thumbnail,image_id,place_of_origin&page=1&limit=10&query[match][place_of_origin]=france
要搜索title includes night的艺术品,我可以使用这个查询(100%正常):https://api.artic.edu/api/v1/artworks/search?fields=id,api_link,title,description,thumbnail,image_id,place_of_origin&page=1&limit=10&query[term][title]=night

合并两个查询参数会出现问题

现在,如果我想过滤的艺术品.有place_of_origin=France以及我想搜索的艺术品,其title includes night在同一个API调用.所以,这里是我调用GET请求上的URL:https://api.artic.edu/api/v1/artworks/search?fields=id,api_link,title,description,thumbnail,image_id,place_of_origin&page=1&limit=10&query[term][title]=night&query[match][place_of_origin]=france
它给了我400个糟糕的请求。
以下是我得到的确切答案:

{
    "error": {
        "root_cause": [
            {
                "type": "parsing_exception",
                "reason": "[term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
                "line": 1,
                "col": 416
            }
        ],
        "type": "x_content_parse_exception",
        "reason": "[1:416] [bool] failed to parse field [must]",
        "caused_by": {
            "type": "x_content_parse_exception",
            "reason": "[1:416] [bool] failed to parse field [should]",
            "caused_by": {
                "type": "x_content_parse_exception",
                "reason": "[1:416] [bool] failed to parse field [must]",
                "caused_by": {
                    "type": "x_content_parse_exception",
                    "reason": "[1:416] [bool] failed to parse field [must]",
                    "caused_by": {
                        "type": "parsing_exception",
                        "reason": "[term] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
                        "line": 1,
                        "col": 416
                    }
                }
            }
        }
    },
    "status": 400
}

字符串
我想他们在后台使用ElasticSearch来让API工作。ElasticSearch文档给了我一些JSON对象。但我不知道如何将这些JSON对象转换为带有查询参数的URL。
有人能告诉我如何使用多个查询吗?

1szpjjfi

1szpjjfi1#

我有一个解决方案here
在这里发布相同的代码,以便将来如果链接被破坏,我们不会失去对该代码的访问:

{
  "from": 0,
  "size": 10,
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "color": [
              "red",
              "yellow"
            ]
          }
        }
      ],
      "filter": [
        {
          "match": {
            "availability": {
              "query": "in stock"
            }
          }
        }
      ]
    }
  }
}

字符串
但解决方案是提供一个对象,我从来不知道:如何将该对象转换为查询字符串参数。
我的一个朋友建议我使用this converter,它可以将JSON转换为查询字符串参数。
我在转换器中使用了以下输入:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "title": "night"
          }
        }
      ],
      "filter": [
        {
          "match": {
            "place_of_origin": "France"
          }
        }
      ]
    }
  }
}


我从转换器收到的输出:

query[bool][must][0][term][title]=night&query[bool][filter][0][match][place_of_origin]=France


这个解决方案是工作100%罚款,但我不完全满意的JSON,我从另一个答案.所以,不会标记我的答案为接受,希望别人张贴一个更好的答案.:)

相关问题