2013-04-04 95 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