【问题标题】:Can you use POST to run a query in Solr (/select)你可以使用 POST 在 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();
            }
        }
    }

【问题讨论】:

    标签: c# .net solr httpclient


    【解决方案1】:
    1. 不要假设。检查 Solr 日志以确认此错误的原因。
    2. /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 中是集合名称。
      猜你喜欢
      • 2019-08-25
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 2011-04-27
      • 2021-03-26
      相关资源
      最近更新 更多