将查询结果转换为对象的Solr C#客户端

时间:2013-11-02 02:43:37

标签: solr

我是solr的新手。

我想知道是否有C#客户端允许我将solr查询结果转换为C#对象?

我也有solr架构xml但不确定如何将其转换为C#类?我需要解析xml吗?

1 个答案:

答案 0 :(得分:0)

C#有许多不同的Solr客户端实现。

我尝试了几种不同的方法,但只有SolrNet使用当前版本。 (SolrNet版本:SolrNet-0.4.0.2002.zip(843.53Kb),Solr版本:4.7.1) Solr Version

首先我尝试使用NuGet包,但结果证明它已过时(使用已弃用的API),从此处获取最新版本:

Solr Net - Master

构建dll并在项目中使用它们。

你可以在这里找到一个很好的教程:

SolrNet tutorial

这里唯一的问题是这些调用现已弃用。您应该调用实际支持的命令而不是Add方法。添加和其他已经过时的方法已经运行良好,但我不认为你应该依赖deprecetad调用。

您可以使用代表不同Solr操作的不同Command类来代替这些。

示例:

using Microsoft.Practices.ServiceLocation;
using SolrNet;
using SolrNet.Attributes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        class Product
        {
            [SolrUniqueKey("id")]
            public string Id { get; set; }

            [SolrField("manu")]
            public string Manufacturer { get; set; }

            [SolrField("cat")]
            public ICollection<string> Categories { get; set; }

            [SolrField("price")]
            public decimal Price { get; set; }

            [SolrField("inStock")]
            public bool InStock { get; set; }
        }

        static void Main(string[] args)
        {
            Startup.Init<Product>("http://localhost:8983/solr");

            var p = new Product
            {
                Id = "SP2514M",
                Manufacturer = "Samsung Electronics Co. Ltd.",
                Categories = new[] {
            "electronics",
            "hard drive",
        },
                Price = 92,
                InStock = true,
            };

            var solr = ServiceLocator.Current.GetInstance<ISolrConnection>();            

            Dictionary<Product, double?> dict = new Dictionary<Product,double?>();
            dict.Add(p, 0);

            Console.WriteLine("-- Add products --");
            AddProducts(solr, dict);

            Console.WriteLine("-- Commit changes --");
            CommitChanges(solr);

            Console.WriteLine("--Query all documents --");
            QueryAll();

            Console.WriteLine("-- Delete all documents --");
            DeleteAll(solr);

            Console.WriteLine("-- Commit changes --");
            CommitChanges(solr);

            Console.WriteLine("--Query all documents --");
            QueryAll();

            Console.ReadKey();            
        }

        private static void DeleteAll(ISolrConnection solr)
        {

            SolrNet.DeleteParameters del = new DeleteParameters();
            SolrNet.Impl.FieldSerializers.DefaultFieldSerializer deffield = new SolrNet.Impl.FieldSerializers.DefaultFieldSerializer();
            SolrNet.Impl.QuerySerializers.DefaultQuerySerializer defquery = new SolrNet.Impl.QuerySerializers.DefaultQuerySerializer(deffield);

            SolrNet.Commands.Parameters.DeleteByIdAndOrQueryParam delpar = new SolrNet.Commands.Parameters.DeleteByIdAndOrQueryParam(Enumerable.Empty<string>(), SolrNet.SolrQuery.All, defquery);
            var delete = new SolrNet.Commands.DeleteCommand(delpar, del);
            string res = delete.Execute(solr);
            System.Diagnostics.Trace.WriteLine(res);
        }

        private static void CommitChanges(ISolrConnection solr)
        {
            SolrNet.Commands.CommitCommand commit = new SolrNet.Commands.CommitCommand();
            string res = commit.Execute(solr);
            System.Diagnostics.Trace.WriteLine(res);
        }

        private static void AddProducts(ISolrConnection solr, Dictionary<Product, double?> dict)
        {
            AddParameters par = new AddParameters();
            ISolrDocumentSerializer<Product> ser = ServiceLocator.Current.GetInstance<ISolrDocumentSerializer<Product>>();
            SolrNet.Commands.AddCommand<Product> addProduct = new SolrNet.Commands.AddCommand<Product>(dict, ser, par);
            string res = addProduct.Execute(solr);
            System.Diagnostics.Trace.WriteLine(res);
        }

        private static void QueryAll()
        {
            // Query all documents
            var query = SolrNet.SolrQuery.All;
            var operations = ServiceLocator.Current.GetInstance<ISolrOperations<Product>>();
            var Products = operations.Query(query);

            int i = 0;
            foreach (var product in Products)
            {
                i++;
                Console.WriteLine("{0}:\t {1} \t{2} \t{3}", i, product.Id, product.Manufacturer, product.Price);
            }

            if(i == 0)
            {
                Console.WriteLine(" = no documents =");
            }
        }
    }
}

我对Solr也很新,所以我的代码可能包含一些缺陷。请帮我发现它们。谢谢。

请参阅QueryAll方法以查询和使用生成的对象。