處理xml或者json格式返回資料之easynet.solr
在easynet.solr中,有兩個介面最重要,一個是轉碼器介面icodec,一個是solr輸出結果解析器介面isolrresponseparser<st, dt>。
easynet.solr內建了兩個轉碼器實現:javabincodec,textcodec。javabincodec對應solr中基於javabin協議,textcodec對應solr中的xml、json等基於文本的協議。相應定義了binarycodecfactory,用於建立javabincodec,textcodecfactory用於建立textcodec。在solrconnection中有個codecfactory的屬性,這是
public class example
2 {
3 public string id { get; set; }
4 public string name { get; set; }
5 public ilist<string> features { get; set; }
6 public datetime modifieddatetime { get; set; }
7 }
定義exampleobjectdeserialize用於還原序列化:
view code
1 public class exampleobjectdeserialize : iobjectdeserialize<example>
2 {
3 public ienumerable<example> deserialize(solrdocumentlist result)
4 {
5 var examples = new list<example>();
6
7 foreach (solrdocument doc in result)
8 {
9 examples.add(new example()
10 {
11 id = doc["id"].tostring(),
12 name = doc["name"].tostring(),
13 modifieddatetime = convert.todatetime(doc["last_modified"]),
14 features = (ilist<string>)doc["features"]
15 });
16 }
17
18 return examples;
19 }
20 }
處理xml格式返回資料:
view code
1 var codefactory = new textcodecfactory();
2 var con = new solrconnection<string>("http://localhost:8088/solr") { codecfactory = codefactory };
3 var objectdeserialize = new exampleobjectdeserialize();
4 var qop = new solrqueryoperations<string>(con);
5 var options = new namevaluecollection();
6
7 options.add(commonparams.start, "0");
8 options.add(commonparams.rows, "10");
9 options.add(highlightparams.highlight, "true");
10 options.add(highlightparams.fields, "name");
11 options.add(commonparams.wt, "xml");
12
13 var response = qop.query(new solrquery("name:terry"), options);
14
15 //解析返回頭資訊
16 var xmlresponseheaderparser = new xmlresponseheaderparser();
17
18 var responseheader = xmlresponseheaderparser.parser(response);
19
20 //解析高亮
21 var xmlhighlightingparser = new xmlhighlightingparser();
22
23 var highlighting = xmlhighlightingparser.parser(response);
24
25 //解析查詢結果
26 var xmlqueryresultsparser = new xmlqueryresultsparser<example>(objectdeserialize);
27
28 var examples = xmlqueryresultsparser.parser(response);
處理json格式返回資料:
view code
1 var codefactory = new textcodecfactory();
2 var con = new solrconnection<string>("http://localhost:8088/solr") { codecfactory = codefactory };
3 var objectdeserialize = new exampleobjectdeserialize();
4 var qop = new solrqueryoperations<string>(con);
5 var options = new namevaluecollection();
6
7 options.add(commonparams.start, "0");
8 options.add(commonparams.rows, "10");
9 options.add(highlightparams.highlight, "true");
10 options.add(highlightparams.fields, "name");
11 options.add(commonparams.wt, "json");
12
13 var response = qop.query(new solrquery("name:terry"), options);
14
15 //解析頭資訊
16 var jsonresponseheaderparser = new jsonresponseheaderparser();
17
18 var responseheader = jsonresponseheaderparser.parser(response);
19
20 //解析高亮
21 var jsonhighlightingparser = new jsonhighlightingparser();
22
23 var highlighting = jsonhighlightingparser.parser(response);
24
25 //解析查詢結果
26 var jsonqueryresultsparser = new jsonqueryresultsparser<example>(objectdeserialize);
27
28 var examples = jsonqueryresultsparser.parser(response);
上面的執行個體處理過程是
1.定義icodecfactory,由於xml、json都是基於文本的,所以我們使用textcodecfactory。
2.建立指定icodecfactory的solr串連isolrconnection。
3. 建立isolrqueryoperations<t>用於solr查詢,t為返回結構資料類型,此處應該為string類型。
4.預先定義好的iobjectdeserialize<t>,對象還原序列化介面實現。t為要還原序列化為的對象資料類型。
5.構造查詢字串及查詢選項。
6.進行查詢,返回結果。
7.對於查詢結果,可以用各種實現isolrresponseparser<st, dt>介面的解析器進行解析。st為原資料類型,此處為stirng類型,dt為解析結果的資料類型。