我目前正在尝试将Solrnet与正在研究的项目集成在一起,甚至无法让Solrnet从填充的POCO中生成文档。以下是我正在使用的POCO的示例
public class Person : ICustomInterface
{
[SolrField("text")]
public string ContactNumber { get; set; }
[SolrField("text")]
public string ContactFax { get; set; }
[SolrField("text")]
public string ContactEmail { get; set; }
[SolrField("text")]
public string FamilyName { get; set; }
[SolrField("text")]
public string GivenName { get; set; }
[SolrField("text")]
public string MiddleName { get; set; }
[SolrField("text")]
public string Title { get; set; }
[SolrField("text")]
public string Gender { get; set; }
[SolrField("text")]
public string PlaceOfBirth { get; set; }
[SolrField("text")]
public string CountryOfBirth { get; set; }
[SolrUniqueKey("id")]
public string Id { get; set; }
}
我在尝试使用以下代码对上面的内容进行索引之前,先调用init函数。
Startup.Init<Person>("http://localhost:8080/solr-4.1.0");
然后,我调用以下内容尝试对对象进行索引。
var solr = ServiceLocator.Current.GetInstance<ISolrOperations<Person>>();
solr.Add(mypoco);
solr.Commit();
在'solr.Add(person)'上的错误是:“文档缺少必需的uniqueKey字段:id”。查看正在发送的http请求,这很有意义,请求的主体为:
<add><doc /></add>
。似乎没有任何领域。进一步研究,“ AttributesMappingManager”返回0个结果。方法在下面,我从“ GetPropertiesWithAttribute”中看到了注释结果。
var props = type.GetProperties(BindingFlags.Instance | BindingFlags.Public); //returns properties correctly
var kvAttrs = props.Select(prop => new KeyValuePair<PropertyInfo, T[]>(prop, type.GetCustomAttributes<T>())); // correct number of keys of properties with Solrnet attributes, but values are empty
var propsAttrs = kvAttrs.Where(kv => kv.Value.Length > 0); // 0 results
return propsAttrs; // 0 results
我尝试将其分解为一个测试项目,但仍然遇到相同的问题。我尝试过有无接口,但仍然没有运气。我可能缺少一些非常简单的东西,但是很想知道它是什么。
注意:我正在使用github repository中最新版本的Solrnet
更新资料
测试了'SampleSolrApp'解决方案,修复了一些引用(在'HomeController.cs'中找不到SolrNet.DSL,似乎缺少SolrNet.DSL引用,从已编译的github存储库中添加了引用),示例似乎已正确初始化,文章通过Application_Start上的
AddInitialDocuments()
方法获取“ exampledocs”。但是,在收到错误消息“字典中不存在给定的密钥”后不久,这种方法就起作用了。在“ HtmlHelperMapperExtensions.cs”中。 “产品”对象确实具有正确的属性,具有映射器正在寻找的字段名称,但找不到任何字段(在这种情况下为“ cat”)。这符合我遇到的问题,因为它没有为solr构建有效的http请求,因为它似乎无法找到SolrField属性。要在另一台PC上测试样本,以查看此问题是否与我的开发环境有关。任何意见或建议,将不胜感激。
更新2
在另一个开发环境上进行了测试,但出现了同样的错误。因此,即使在示例中,似乎
GetCustomAttributes
扩展方法也不会返回pocos上的属性。我正在VS 2012(.net 4.5,在示例项目中以3.5为目标),Win7机器上的IIS Express上运行示例。希望有人可以指出正确的方向进行进一步调查。 最佳答案
首先,不确定您为什么会收到“文档缺少必需的uniqueKey字段:id”错误,因为您似乎已经正确装饰了Id属性。由于没有显示如何创建mypoco
对象,因此我将检查您是否设置了Id属性(因为需要提供Id属性(且Id必须是唯一的,因为Solr不会自动分配该ID))。另外,我注意到您正在将所有其他字段映射到架构中的text
字段。这不是完成此行为的标准做法。通常,您需要将POCO上的每个属性映射到架构中的单独字段(有关示例,请参见SolrNet项目页面上的Mapping),然后在架构中使用copyField
指令将所有单个字段移至架构中。通用文本字段。这样一来,您就可以在组合的text
字段或单个字段中进行搜索,并在各个字段上启用诸如突出显示和刻面等选项。
请签出Documents, Fields and Schema Design以获取有关设置自己的自定义字段和使用copyField的更多详细信息。此外,由于您具有来自GitHub的SolrNet源代码,因此建议您运行并检查SampleSolrApp目录中的代码,以更好地了解SolrNet。您可以通过源父目录中的runsample.bat启动示例。
关于c# - Solrnet找不到SolrField属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15823665/