你可以使用POST在Solr中运行查询(/ select)

时间:2010-06-08 11:56:47

标签: c# .net solr httpclient

我有查询,我正在运行solr索引,有时候有很长的查询参数,当我运行这些查询时出现错误,我认为这是对GET查询参数的限制。

这是我用来查询的方法(JSON),这是为了表明我使用的是Http Extensions(我使用的客户端是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();
            }
        }
    }

4 个答案:

答案 0 :(得分:13)

  1. 不要假设。检查Solr日志以确认出现此错误的原因。
  2. / select接受POST请求而不会出现问题。你可以用curl试试这个:

    curl -d "q=*:*&rows=1" http://localhost:8983/solr/select
    

    我无法评论XmlHttpServiceClient,因为它似乎是一些专有代码,但请参阅this page以获取使用HttpWebRequest进行POST的示例。

  3. BTW:有.net库可以实现与Solr的通信,除非你有一些非常奇怪的要求,否则不需要自己动手。

答案 1 :(得分:7)

请务必设置内容类型:application / x-www-form-urlencoded ,否则您将获得500的状态代码。

Curl默认执行此操作。

如果你的XmlHttpServiceClient被硬编码/默认使用text / xml作为内容类型,那就不会让我感到惊讶。 HttpWebRequest更合适。

答案 2 :(得分:3)

Solr支持HTTP GET和HTTP POST。

执行HTTP POST时正确设置内容类型。 您可以使用Postman或Fiddler进行验证。

更正内容类型:  内容类型:应用/ X WWW的窗体-urlencoded

如果没有正确的内容类型,您将收到错误消息 :远程服务器返回错误:(400)错误请求

答案 3 :(得分:0)

是的,可以的!

只需将数据发布到同一路径(http://localhost:8983/solr/coreName/select)。

params对象键中,像这样使用JSON正文发布相同的数据,而不使用查询字符串参数:

{
  params: {
     "q": "field:value",
     "rows": 10,
     "wt": "json"
  }
}