繁体   English   中英

高级搜索REST API

[英]Advanced search REST API

我的要求是实现高级搜索Rest API来搜索手机。 搜索API的URI是http:// myservice / api / v1 / phones / search?q = $ {query_expression}

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

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

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

  • 第一种方法 - 发送查询表达式的完整中缀表达式。 例如。

PHONENAME STARTSWITH 'AR' AND ( PHONETYPE = '4G' OR PHONECOLOR = 'RED')

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

    {"criteria":[ {"index":1,"field":"PHONENAME","value":"AR","comparator":"STARTSWITH"}, {"index":2,"field":"PHONETYPE","value":"4G","comparator":"EQUALS"}, {"index":3,"field":"PHONECOLOR","value":"RED","comparator":"EQUALS"} ],"criteria":"( 1 AND (2 OR 3) )"}

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

    {"and":[ {"field":"PHONENAME","value":"AR","comparator":"STARTSWITH"}, "or":[ {"field":"PHONETYPE","value":"4G","comparator":"EQUALS"}, {"field":"PHONECOLOR","value":"RED","comparator":"EQUALS"}] ]}

哪三种方法可以被认为更加RESTful? 欢迎任何其他方法的建议:)

你可以遵循ElasticSearch采用的方法,你给出的例子中的第三个是。

请参阅https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html

第三种方法也更容易理解,更易于维护。 例如,如果将来您需要添加“模糊”查询运算符,它将具有完全不同的模型,这将是一件容易的事情。

  1. 是的, POST是一个全能的。 最好将它用于资源创建,但根据规范它也可以这种方式使用。 但是,您应该考虑将端点更改为/search-results 这使您可以灵活地在以后开始存储搜索结果,并且可以返回指向特定复杂查询结果的Location标头。 另一种方法是让用户POST他们的搜索条件,然后做一个GET /搜索结果?标准= {ID}。

  2. 不要做第二个。 它很难阅读,也比应该更复杂。 第一个或第三个都没问题。 第一种是更紧凑但在后端可能更难处理。 对于第三个,你真的不需要索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM