2013-04-04 59 views
2

我目前正在尝试将Solrnet与我正在开发的一个项目集成在一起,我甚至无法让Solrnet从生成的POCO生成文档。下面是我正在使用的POCOs的一个示例Solrnet找不到SolrField属性

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)'的错误是:“Document is missing mandatory uniqueKey field: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 

我试图打破这一点,到测试项目,并仍然得到同样的问题。我尝试过和没有界面,仍然没有运气。我可能会错过真的简单,但很想知道它是什么。

注:我使用的是最新版本的Solrnet从github repository

更新 测试“SampleSolrApp”的解决方案,固定了一些引用(在“HomeController.cs”找不到SolrNet.DSL ,SolrNet.DSL ref似乎缺少,从编译的github repo中添加了引用),sample似乎正确初始化,通过Application_Start上的AddInitialDocuments()方法发布'exampledocs'。然而,在我收到错误之后不久,“这个给定的密钥不在字典中”。在'HtmlHelperMapperExtensions.cs'中。 'Product'对象确实具有正确的属性,映射器正在查找字段名称,但无法找到任何字段(在这种情况下为'cat')。这匹配我遇到的问题,因为它没有构建solr的有效http请求,因为它似乎无法找到SolrField属性。

去测试另一台PC上的样本,看看这个问题是否与我的开发环境有关。任何意见或建议,将不胜感激。

更新2 在另一个开发环境中测试,我得到相同的错误。因此,即使在示例中,GetCustomAttributes扩展方法似乎也没有返回pocos 上的属性。我正在VS 2012上运行示例(.net 4.5,示例项目中的目标为3.5),Win7机器上的IIS Express。希望有人能够指引我进一步调查的正确方向。

回答

0

(用户)错误已被解决,这是一个简单的错误,带来了一些奇怪的后果。我仍然不确定问题的根本原因是什么,但是我用于示例应用程序和我自己的应用程序的本地编译的dll是由VS解决方案构建而成的。当我第一次下载build.bat文件时,我遇到了一些麻烦(一旦我运行它,与本地计算机问题,而不是构建脚本),因此我试图直接从解决方案/项目中构建它。

移动到另一台PC我从build.bat文件构建了所有库,示例应用程序现在可以工作,我的其他应用程序也可以工作。

TLDR从

构建库BUILD.BAT

2

首先,不确定为什么你会得到“缺少文档缺少强制uniqueKey字段:id”错误,因为你似乎已经适当地修饰了你的Id属性。由于您未展示如何创建mypoco对象,因此我会检查您是否设置了Id属性(因为Id需要提供(并且唯一),因为不由Solr自动分配)。另外,我注意到您正在将所有其他字段映射到模式中的text字段。这不是完成此行为的标准做法。您通常会将POCO上的每个属性映射到模式中的单独字段(例如,参见SolrNet项目页面上的Mapping),并在模式中使用copyField指令将所有单个字段移动到公共文本字段中。这使您可以搜索组合的text字段或单个字段以及启用选项,例如突出显示和单个字段上的分面。

请查看Documents, Fields and Schema Design了解更多有关设置自定义字段和使用copyField的详细信息。此外,由于您拥有来自GitHub的SolrNet源代码,因此我建议您运行并检查SampleSolrApp目录中的代码,以便对SolrNet有一个很好的理解。您可以通过源父目录中的runsample.bat启动示例。

+0

干杯的反应,我将看看获得样品运行明天,希望它揭示了什么我做错了一些轻。 – 2013-04-07 08:28:46

+0

感谢您对'copyField'的建议,已经派上用场了,纯粹是自己造成的问题。谢谢你的帮助 :) – 2013-04-10 01:52:36