C# 如何在SolrNet中实现JSON方面API

C# 如何在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

我想在Solr中创建聚合函数,我从中找到了方法 但我不能在SolrNet中实现它

如何在SolrNet中实现JSON方面API

        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