你可以使用 POST 在 Solr (/select) 中运行查询吗
Posted
技术标签:
【中文标题】你可以使用 POST 在 Solr (/select) 中运行查询吗【英文标题】:Can you use POST to run a query in Solr (/select) 【发布时间】:2010-06-08 11:56:47 【问题描述】:我有针对 solr 索引运行的查询,这些索引有时具有很长的查询参数,当我运行这些查询时出现错误,我认为这是对 GET 查询参数的限制。
这是我用来查询的方法 (JSON),这是为了表明我使用的是 Http 扩展(我使用的客户端是 HttpClient 的瘦包装器),而不是端到端的解决方案。 90% 的查询运行良好,只是当参数很大时,我从 solr 收到 500 错误。我在某处读过您可以在执行 select 命令时使用 POST,但没有找到如何执行此操作的示例。任何帮助都会很棒!
public string GetJson(HttpQueryString qs)
using (var client = new DAC.US.Web.XmlHttpServiceClient(this.Uri))
client.Client.DefaultHeaders.Authorization = new Microsoft.Http.Headers.Credential("Basic", DAC.US.Encryption.Hash.WebServiceCredintials);
qs.Add("wt", "json");
if (!String.IsNullOrEmpty(this.Version))
qs.Add("version", this.Version);
using (var response = client.Get(new Uri(@"select/", UriKind.Relative), qs))
return response.Content.ReadAsString();
【问题讨论】:
【参考方案1】:-
不要假设。检查 Solr 日志以确认此错误的原因。
/select 毫无问题地接受 POST 请求。你可以用 curl 试试这个:
curl -d "q=*:*&rows=1" http://localhost:8983/solr/select
我无法对 XmlHttpServiceClient 发表评论,因为它似乎是一些专有代码,但请参阅 this page 了解使用 HttpWebRequest 进行 POST 的示例。
顺便说一句:有实现与 Solr 通信的 .net 库,除非您有一些非常奇怪的要求,否则无需自行开发。
【讨论】:
从技术上讲,我没有使用 HttpWebRequest,而是使用 Microsoft.Http 库的薄包装器。我有相当多的要求,我发现用 SolrNet 等更难实现。我想我的主要问题是,POST 参数数据是否等于 GET 的查询字符串。从您的 curl 示例看来,该帖子需要 1 个参数... @RyanFetz:是的,POST 数据与查询字符串相同。 @RyanFetz:顺便说一句,我有兴趣了解 SolrNet 的这些困难 :-)【参考方案2】:一定要设置Content type: application/x-www-form-urlencoded,否则你会得到500的状态码。
Curl 默认会这样做。
如果您的 XmlHttpServiceClient 是硬编码/默认使用 text/xml 作为内容类型,我不会感到惊讶。 HttpWebRequest 更合适。
【讨论】:
我花了很多时间试图弄清楚为什么这篇文章对我不起作用。我终于想通了,然后阅读您的回复。这将教会我不要检查其他答案。【参考方案3】:Solr 支持 HTTP GET 和 HTTP POST。
在执行 HTTP POST 时正确设置内容类型。 您可以使用 Postman 或 Fiddler 进行验证。
正确的内容类型: 内容类型:application/x-www-form-urlencoded。
如果没有正确的内容类型,您将收到错误消息 :远程服务器返回错误:(400) Bad Request
【讨论】:
【参考方案4】:是的,你可以!
只需将数据发布到同一路径 (http://localhost:8983/solr/coreName/select
)。
不使用查询字符串参数,而是在 params
对象键中 POST 与 JSON 正文相同的数据,如下所示:
"params":
"q": "field:value",
"rows": 10,
"wt": "json"
【讨论】:
coreName
在 URL 中是集合名称。以上是关于你可以使用 POST 在 Solr (/select) 中运行查询吗的主要内容,如果未能解决你的问题,请参考以下文章
solr:突出显示:hl.simple.pre/post 有时不会出现