gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:58:02 24 4
gpt4 key购买 nike

我真的是 solr 的新手。

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

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

最佳答案

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 方法。 Add 和其他已弃用的方法已经运行良好,但我认为您不应该依赖已弃用的调用。

除了这些,您还可以使用代表不同 Solr 操作的不同命令类。

例子:

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 方法。

关于将查询结果转换为对象的 Solr C# 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19738424/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com