1

C#/Winforms/.NET4.0 アプリから HTTP/POST 経由で JSON を使用して Solr に書き込み、インデックス作成を高速化し、以下のコードを使用しています。(これらの指示に基づいて)solrにドキュメントを書きますが、「400 bad request」を取得し続けます。JSON はクリーンで問題はないようです。

構文の問題のようですが、私はこれに何時間も取り組んできましたが、役に立ちませんでした。何が間違っているかについてのアイデアはありますか?すべての助けに感謝します。

投稿されているURI文字列は次のとおりです

"http://localhost:8080/solr/update/json -H 'Content-type:application/json' -d ' [ {\"UUID\":\"d2a174e4-81d6-487f-b68d-392be5d3d47a\",\"Extension\":\".AVI\",\"VideoFileName\":\"Clip 1.avi\"} ' ]"

string uri = http://localhost:8080/solr/update/json;

public bool WriteJSONToSolr(string uri, string json)
        {
            WebRequest request = WebRequest.Create(uri + " -H 'Content-type:application/json' -d ' [ " + json + " ' ]" );
            request.ContentType = "application/x-www-form-urlencoded";
            request.Method = "POST";
            byte[] bytes = Encoding.ASCII.GetBytes(json);
            Stream stream = null;
            try
            { // send the Post
                request.ContentLength = bytes.Length;   //Count bytes to send
                stream = request.GetRequestStream();
                stream.Write(bytes, 0, bytes.Length);         //Send it
            }
            catch
            {
                return false;
            }
            finally
            {
                if (stream != null)
                {
                    stream.Close();
                }
            }
            System.Net.WebResponse response = request.GetResponse();
            if (response == null) return false;

            return true;
        }
4

6 に答える 6

1

挿入する場合は、json 要素で add と doc を使用する必要があります。また、インデックスが更新されるようにコミットを追加する必要があります。Web 要求オブジェクトにパラメーターを追加できるので、uri からパラメーターを削除することもできます。最後に、コレクション名を uri に含める必要があります。

string json = "{\"add\":{\"doc\":{"
  + "\"UUID\":\"d2a174e4-81d6-487f-b68d-392be5d3d47a\","
  + "\"Extension\":\".AVI\","
  + "\"VideoFileName\":\"Clip 1.avi\"}},";
  + "\"commit\":{}}";
string uri = "http://localhost:8080/solr/collection/update";

WebRequest request = WebRequest.Create(uri);
request.ContentType = "application/json";
request.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(json);
Stream stream = null;

try {
  request.ContentLength = bytes.Length;
  stream = request.GetRequestStream();
  stream.Write(bytes, 0, bytes.Length);
}
catch {
  return;
}
finally {
  if (stream != null) {
    stream.Close();
  }
}
System.Net.WebResponse response = request.GetResponse();
if (response == null) {
  return;
}

複数のオブジェクトを solr に挿入する場合は、複数の add オブジェクトまたは doc オブジェクトを json に追加できます。例えば...

json = "{add:{doc:{keys:values}}, add:{doc:{keys:values}}, commit:{}}"

また

json = "{add:{doc:{keys:values}, doc:{keys:values}}, commit:{}}"

これをデバッグしている間、solr のログを監視します。solr側で発生している可能性のある問題について警告します。

于 2015-01-20T19:18:23.053 に答える
1

まず、-d オプションで正しい json データを渡しているとは思いません。コード内の次の書式設定コードを見てください。

" -H 'Content-type:application/json' -d ' [ " + json + " ' ]" 

あなたのjsonデータ{"name":"sam"}

-H 'Content-type:application/json' -d ' [{"name":"sam"} ' ]

]が欠落しているjsonデータを渡しています。

それとは別に、solr インデックスでドキュメントを更新するアプローチは間違っています。次の簡単なコードを見てください。[ところで: URL に 'commit' 引数を渡すことができます]。

public async Task PostAsync()
{
    string json = "{\"add\": {\"doc\": {"
        + "\"id\":\"12345\","
        + "\"firstname\":\"Sam\","
        + "\"lastname\":\"Wills\","
        + "\"dob\":\"2016-12-14T00:00:00Z\""
        + "}}}";

    using (var client = new HttpClient())
    {
        string uri = "http://localhost:8983/solr/people/update/json?wt=json&commit=true";
        var jsonContent = new StringContent(json);
        await client.PostAsync(new Uri(uri), jsonContent);
    }
}

ドキュメント全体ではなく特定のフィールドを更新する場合 [部分更新] は、次のコード スニペットを使用します。

public async Task PartialPostAsync()
{
    string json = "{\"add\": {\"doc\": {"
        + "\"id\":\"12345\","
        + "\"lastname\":{\"set\":\"George\"}"
        + "}}}";

    using (var client = new HttpClient())
    {
        string uri = "http://localhost:8983/solr/people/update/json?wt=json&commit=true";
        var jsonContent = new StringContent(json);
        await client.PostAsync(new Uri(uri), jsonContent);
    }
}

「id」フィールドは一意のフィールドです。

于 2016-01-23T17:46:57.850 に答える
0

space前に charを置くのを忘れました-Hか?

于 2012-07-06T02:52:57.463 に答える
0

コードが機能しない理由は、.Net で cURL 構文を使用しているためです。

cURL は HTTP 要求を送受信する実行可能ファイルであり、.Net はアプリケーションをプログラミングするためのフレームワークです。

それらは同じではありません。

.Net で動作させるには、最初に正しい uri に投稿する必要があり、次のように正しい ContentType プロパティを設定する必要があります。

var uri = "http://localhost:8080/solr/update/json";
using (var r = WebRequest.Create(uri))
{
    r.ContentType = "application/json";
    r.Method = "POST";
    using (var rs = r.GetRequestStream())
        rs.Write // your data
    // get response
    // return response data
}

そうは言っても、なぜ自分に苦痛を与えるのですか?SolR 操作用の型付き API が既にある SolR コネクタを使用するだけです。

https://code.google.com/p/solrnet/たとえば!

ただし、それを使用したくない場合は、少なくともhttps://nuget.org/packages/RestSharpのような最新の HTTP API を使用してください。

于 2012-11-20T18:43:41.327 に答える
0

今日も同じ問題に遭遇しました。

この2つを試してみてください

1)次のようなjson文字列を送信できないことに注意してください

[{"A":"1","B":"0","C":"","D":"Washington"}]

代わりに、jsonをより似たものにする必要があるかもしれません

[{"A":"1","B":"0","D":"Washington"}]

Solr は空の値を好みません。

2) 役立つこの 2 番目のトリック (「curl」を介して solr にデータを送信する場合): リクエストを solr に送信する前に、json 文字列内のすべての二重引用符を 2 つの二重引用符に置き換えてみてください。

json = json.Replace(@"""", @"""""");

于 2012-11-20T17:16:31.850 に答える