C# 如何在SolrNet中实现JSON方面API
我想在Solr中创建聚合函数,我从中找到了方法 但我不能在SolrNet中实现它 如何在SolrNet中实现JSON方面APIC# 如何在SolrNet中实现JSON方面API,c#,asp.net,solr,solrnet,C#,Asp.net,Solr,Solrnet,我想在Solr中创建聚合函数,我从中找到了方法 但我不能在SolrNet中实现它 如何在SolrNet中实现JSON方面API ISolrOperations<DeviceReadings> solr = connection.GetSolrInstance(); QueryOptions queryOption = new QueryOptions { Rows = 0, FilterQ
ISolrOperations<DeviceReadings> solr = connection.GetSolrInstance();
QueryOptions queryOption = new QueryOptions
{
Rows = 0,
FilterQueries = new ISolrQuery[] {
new SolrQueryByField("playerId", query.PlayerId.ToString()),
new SolrQueryByRange<DateTime>("dateTime", query.DateTimeFrom, query.DateTimeTo)
},
Facet = new FacetParameters
{
Queries = new List<ISolrFacetQuery>
{
new SolrFacetFieldQuery("heartRate")
}
}
};
queryOption.ExtraParams = new KeyValuePair<string, string>[] {
new KeyValuePair<string,string>("wt", "xml")
};
//Execute the query
solrResults = solr.Query(SolrQuery.All, queryOption);
isoropertions solr=connection.GetSolrInstance();
QueryOptions queryOption=新的QueryOptions
{
行=0,
FilterQueries=新的ISolrQuery[]{
新的SolrQueryField(“playerId”,query.playerId.ToString()),
新的SolrQueryByRange(“dateTime”,query.DateTimeFrom,query.DateTimeTo)
},
Facet=新的Facet参数
{
查询=新列表
{
新的SolrFacetFieldQuery(“心率”)
}
}
};
queryOption.ExtraParams=新的KeyValuePair[]{
新的KeyValuePair(“wt”、“xml”)
};
//执行查询
solrResults=solr.Query(SolrQuery.All,queryOption);
更新
我是用ExtraParams做的
queryOption.ExtraParams = new KeyValuePair<string, string>[] {
new KeyValuePair<string,string>("wt", "xml"),
new KeyValuePair<string,string>("json.facet", "{heartRateMin: 'min(heartRate)',heartRateMax: 'max(heartRate)',heartRateAvg: 'avg(heartRate)',distance: 'sum(distance)',calories: 'sum(calories)'}")
};
solrResults = await solr.QueryAsync(SolrQuery.All, queryOption);
ReadingsResponseExtraction extractResponse = new ReadingsResponseExtraction();
extractResponse.SetHeader(queryResponce, solrResults);
extractResponse.SetBody(queryResponce, solrResults);
extractResponse.SetFacets(queryResponce, solrResults);
//Return response;
return queryResponce;
queryOption.ExtraParams=新的KeyValuePair[]{
新的KeyValuePair(“wt”、“xml”),
新的KeyValuePair(“json.facet”,“{heartRateMin:'min(heartRate)”,heartRateMax:'max(heartRate)”,heartRateAvg:'avg(heartRate)”,distance:'sum(distance)”,Carries:'sum(Carries)}”)
};
solrResults=await solr.QueryAsync(SolrQuery.All,queryOption);
ReadingResponseExtraction extractResponse=新的ReadingResponseExtraction();
SetHeader(queryResponse、solrResults);
extractResponse.SetBody(QueryResponse,solrResults);
extractResponse.SetFacets(QueryResponse、solrResults);
//返回响应;
返回queryResponce;
ReadingResponseExtraction.cs
internal class ReadingsResponseExtraction
{
//Extract parts of the SolrNet response and set them in QueryResponse class
internal void SetHeader(DeviceQueryResponse queryResponce, SolrQueryResults<DeviceReadings> solrResults)
{
queryResponce.QueryTime = solrResults.Header.QTime;
queryResponce.Status = solrResults.Header.Status;
queryResponce.TotalHits = solrResults.NumFound;
}
internal void SetBody(DeviceQueryResponse queryResponce, SolrQueryResults<DeviceReadings> solrResults)
{
queryResponce.Result = (List<DeviceReadings>)solrResults;
}
internal void SetFacets(DeviceQueryResponse queryResponse, SolrQueryResults<DeviceReadings> solrResults)
{
queryResponse.HeartRateMin = (int)solrResults.Stats["heartRate"].Min;
queryResponse.HeartRateMax = (int)solrResults.Stats["heartRate"].Max;
queryResponse.HeartRateAvg = (int)solrResults.Stats["heartRate"].Mean;
queryResponse.Distance = solrResults.Stats["distance"].Sum;
queryResponse.Calories = solrResults.Stats["calories"].Sum;
}
}
内部类读取响应提取
{
//提取SolrNet响应的部分内容并将其设置在QueryResponse类中
内部无效集合标头(DeviceQueryResponse QueryResponse、SolrQueryResults solrResults)
{
queryResponse.QueryTime=solrResults.Header.QTime;
queryResponse.Status=solrResults.Header.Status;
queryResponse.TotalHits=solrResults.NumFound;
}
内部空穴沉降体(设备QueryResponse QueryResponse,SolrQueryResults solrResults)
{
queryResponse.Result=(列表)solrResults;
}
内部void SetFacets(DeviceQueryResponse queryResponse、SolrQueryResults solrResults)
{
queryResponse.HeartRateMin=(int)solrResults.Stats[“heartRate”].Min;
queryResponse.HeartRateMax=(int)solrResults.Stats[“heartRate”].Max;
queryResponse.HeartRateAvg=(int)solrResults.Stats[“心率”]。平均值;
queryResponse.Distance=solrResults.Stats[“Distance”].Sum;
queryResponse.carries=solrResults.Stats[“carries”].Sum;
}
}
就我所知,SolrNet还没有支持json.facet的.NET API,如何从extraParames中获取这些值。但是,始终可以通过QueryOptions.ExtraParams属性附加额外的查询参数。根据您的示例:
queryOption.ExtraParams = new KeyValuePair<string, string>[] {
new KeyValuePair<string,string>("wt", "xml"),
new KeyValuePair<string,string("json.facet", "YOUR_JSON_FACET"),
};
接下来,您需要从Solr的响应中读取方面值。可能有更干净的方法可以做到这一点,但有一种不涉及修改SolrNet内部结构的方法是编写自己的查询方法,该方法也输出原始XML。从原始XML中,您可以读取相应的json.facet节点
public static SolrQueryResults<T> QueryWithRawXml<T>(this ISolrOperations<T> operations,
ISolrQuery query, QueryOptions queryOptions, out XDocument xml)
{
var executor = (SolrQueryExecuter<T>)ServiceLocator.Current.GetInstance<ISolrQueryExecuter<T>>();
var connectionKey = string.Format("{0}.{1}.{2}", typeof(SolrConnection), typeof(T), typeof(SolrConnection));
var connection = ServiceLocator.Current.GetInstance<ISolrConnection>(connectionKey);
var parser = ServiceLocator.Current.GetInstance<ISolrAbstractResponseParser<T>>();
var parameters = executor.GetAllParameters(query, queryOptions);
var responseXml = connection.Get(executor.Handler, parameters);
xml = XDocument.Parse(responseXml);
var results = new SolrQueryResults<T>();
parser.Parse(xml, results);
return results;
}
public IEnumerable<KeyValuePair<string, int> GetJsonFacets(
XDocument xml, string facetFieldName, string countFieldName = "count")
{
var response = xml.Element("response");
if (response == null)
{
yield break;
}
var mainFacetNode = response
.Elements("lst")
.FirstOrDefault(e => e.Attribute("name")?.Value == "facets");
if (mainFacetNode == null)
{
yield break;
}
var groupFacetElement = mainFacetNode
.Elements("lst")
.FirstOrDefault(x => x.Attribute("name")?.Value == facetFieldName);
if (groupFacetElement == null)
{
yield break;
}
var buckets = groupFacetElement.Elements("arr")
.FirstOrDefault(x => x.Attribute("name")?.Value == "buckets");
if (buckets == null)
{
yield break;
}
foreach (var bucket in buckets.Elements("lst"))
{
var valNode = bucket.Elements()
.FirstOrDefault(x => x.Attribute("name")?.Value == "val");
var countNode = bucket.Elements()
.FirstOrDefault(x => x.Attribute("name")?.Value == countFieldName);
int count;
if (valNode != null && countNode != null &&
int.TryParse(countNode.Value, out count))
{
yield return new KeyValuePair<string, int>(valNode.Value,count)
}
}
}
公共静态SolrQueryResults QueryWithRawXml(此操作,
ISolrQuery查询、查询选项查询选项、out XDocument xml)
{
var executor=(SolrQueryExecuter)ServiceLocator.Current.GetInstance();
var connectionKey=string.Format(“{0}.{1}.{2}”,typeof(SolrConnection),typeof(T),typeof(SolrConnection));
var connection=ServiceLocator.Current.GetInstance(connectionKey);
var parser=ServiceLocator.Current.GetInstance();
var参数=executor.GetAllParameters(查询、查询选项);
var responseXml=connection.Get(executor.Handler,参数);
xml=XDocument.Parse(responseXml);
var结果=新的SolrQueryResults();
parser.Parse(xml,results);
返回结果;
}
公共IEnumerable e.Attribute(“name”)?.Value==“facets”);
如果(mainFacetNode==null)
{
屈服断裂;
}
var groupFaceElement=mainFacetNode
.要素(“lst”)
.FirstOrDefault(x=>x.Attribute(“name”)?.Value==facetFieldName);
if(groupFaceElement==null)
{
屈服断裂;
}
var bucket=GroupFaceElement.Elements(“arr”)
.FirstOrDefault(x=>x.Attribute(“name”)?.Value==“bucket”);
if(bucket==null)
{
屈服断裂;
}
foreach(桶中的var桶。元素(“lst”))
{
var valNode=bucket.Elements()
.FirstOrDefault(x=>x.Attribute(“name”)?.Value==“val”);
var countNode=bucket.Elements()
.FirstOrDefault(x=>x.Attribute(“name”)?.Value==countFieldName);
整数计数;
如果(valNode!=null&&countNode!=null&&
int.TryParse(countNode.Value,out count))
{
返回新的KeyValuePair(valNode.Value,count)
}
}
}
据我所知,SolrNet还没有支持json.facet的.NET API。但是,始终可以通过QueryOptions.ExtraParams属性附加额外的查询参数。根据您的示例:
queryOption.ExtraParams = new KeyValuePair<string, string>[] {
new KeyValuePair<string,string>("wt", "xml"),
new KeyValuePair<string,string("json.facet", "YOUR_JSON_FACET"),
};
接下来,您需要从Solr的响应中读取方面值。可能有更干净的方法可以做到这一点,但有一种不涉及修改SolrNet内部结构的方法是编写自己的查询方法,该方法也输出原始XML。从原始XML中,您可以读取相应的json.facet节点
public static SolrQueryResults<T> QueryWithRawXml<T>(this ISolrOperations<T> operations,
ISolrQuery query, QueryOptions queryOptions, out XDocument xml)
{
var executor = (SolrQueryExecuter<T>)ServiceLocator.Current.GetInstance<ISolrQueryExecuter<T>>();
var connectionKey = string.Format("{0}.{1}.{2}", typeof(SolrConnection), typeof(T), typeof(SolrConnection));
var connection = ServiceLocator.Current.GetInstance<ISolrConnection>(connectionKey);
var parser = ServiceLocator.Current.GetInstance<ISolrAbstractResponseParser<T>>();
var parameters = executor.GetAllParameters(query, queryOptions);
var responseXml = connection.Get(executor.Handler, parameters);
xml = XDocument.Parse(responseXml);
var results = new SolrQueryResults<T>();
parser.Parse(xml, results);
return results;
}
public IEnumerable<KeyValuePair<string, int> GetJsonFacets(
XDocument xml, string facetFieldName, string countFieldName = "count")
{
var response = xml.Element("response");
if (response == null)
{
yield break;
}
var mainFacetNode = response
.Elements("lst")
.FirstOrDefault(e => e.Attribute("name")?.Value == "facets");
if (mainFacetNode == null)
{
yield break;
}
var groupFacetElement = mainFacetNode
.Elements("lst")
.FirstOrDefault(x => x.Attribute("name")?.Value == facetFieldName);
if (groupFacetElement == null)
{
yield break;
}
var buckets = groupFacetElement.Elements("arr")
.FirstOrDefault(x => x.Attribute("name")?.Value == "buckets");
if (buckets == null)
{
yield break;
}
foreach (var bucket in buckets.Elements("lst"))
{
var valNode = bucket.Elements()
.FirstOrDefault(x => x.Attribute("name")?.Value == "val");
var countNode = bucket.Elements()
.FirstOrDefault(x => x.Attribute("name")?.Value == countFieldName);
int count;
if (valNode != null && countNode != null &&
int.TryParse(countNode.Value, out count))
{
yield return new KeyValuePair<string, int>(valNode.Value,count)
}
}
}
公共静态SolrQueryResults QueryWithRawXml(此操作,
ISolrQuery查询、查询选项查询选项、out XDocument xml)
{
变量执行器=(SolrQueryExecuter)ServiceLocator.Current.GetInsta