你可以使用 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 有时不会出现

Solr如何使用in语法查询

9.Solr4.10.3数据导入(post.jar方式和curl方式)

solr的post.jar

调整DIH Apache Solr

教你使用solr搭建你的全文检索