高级搜索RESTAPI

高级搜索RESTAPI,api,rest,search,filter,Api,Rest,Search,Filter,我的要求是实现高级搜索RESTAPI来搜索手机。搜索API的URI是${query\u expression} 其中q是复杂查询表达式。有以下问题吗 1) 由于高级搜索涉及冗长的查询表达式,因此URI将不适合GET调用。通过POST请求实现搜索API并仍然保持RESTfusion可以吗 2) 我遇到了以下高级搜索的实现: 第一种方法-发送查询表达式的完整中缀表达式。 例如 PHONENAME以'AR'和(PHONETYPE='4G'或PHONECOLOR='RED')开头。 第二种方法-以

我的要求是实现高级搜索RESTAPI来搜索手机。搜索API的URI是${query\u expression}

其中q是复杂查询表达式。有以下问题吗

1) 由于高级搜索涉及冗长的查询表达式,因此URI将不适合GET调用。通过POST请求实现搜索API并仍然保持RESTfusion可以吗

2) 我遇到了以下高级搜索的实现:

  • 第一种方法-发送查询表达式的完整中缀表达式。 例如
PHONENAME以'AR'和(PHONETYPE='4G'或PHONECOLOR='RED')开头。

  • 第二种方法-以json的形式构造整个查询表达式。 例如

    {“标准”:[
    {“index”:1,“field”:“PHONENAME”,“value”:“AR”,“comparator”:“STARTSWITH”},
    {“索引”:2,“字段”:“电话类型”,“值”:“4G”,“比较器”:“等于”},
    {“index”:3,“field”:“PHONECOLOR”,“value”:“RED”,“comparator”:“EQUALS”}
    ],“标准”:(1和(2或3))“}

  • 第三种方法-将查询表达式实现为json的替代方法。 例如

    {“和”:[
    {“field”:“PHONENAME”,“value”:“AR”,“comparator”:“STARTSWITH”},
    “或”:[
    {“字段”:“电话类型”,“值”:“4G”,“比较器”:“等于”},
    {“字段”:“PHONECOLOR”,“值”:“红色”,“比较器”:“等于”}]
    ]}


在这三种方法中,哪一种方法会被认为更安静?欢迎对任何其他方法提出建议:)

您可以遵循ElasticSearch采取的方法,您给出的示例中的第三种是ElasticSearch

第三种方法也更容易理解和维护。 例如,如果将来您需要添加“fuzzy”查询操作符,并且它将具有完全不同的模型,那么这将是一件容易的事情

  • 是的,
    POST
    是一应俱全的。最好使用它来创建资源,但根据规范,它也可以以这种方式使用。但是,您应该考虑将端点更改为<代码> /搜索结果< /代码>。这使您可以灵活地在以后开始存储搜索结果,并且您可以返回指向特定复杂查询结果的
    位置
    标题。另一种方法是让用户
    发布他们的搜索条件,然后执行GET/search results?criteria={id}

  • 不要做第二件事。它很难阅读,而且比它应该的更复杂。第一个或第三个都可以。第一个更紧凑,但在后端可能更难处理。第三,你真的不需要索引


  • 我想说的是,使用参数获取某些资源是REST所需要的。指定为参数的内容对REST不重要(如果它不是URI或其他资源)。所以我会选择选项1,或者类似的东西,在URI中很容易阅读。