2013-02-19 65 views
0

我想在我的.NET應用程序中使用Apache Solr作爲全文搜索引擎(通過SolrNet)。 我的應用程序有這個數據模式: 索引數據庫內的數據,文件存儲在文件系統

class Document 
{ 
    public int Id { get; set; }; 
    public string Name { get; set; } 
    public DateTime CreateDate { get; set;} 
    public Attach[] Attaches { get; set; } 
} 

class Attach 
{ 
    public int Id { get; set; } 
    public Document Parent { get; set; } 
    //files are stored in filesystem, only path stored in database! 
    public string FilePath { get; set; } 
} 

現在,我想這個索引文件(Castle.Windsor使用):

_container.AddFacility("solr", 
    new SolrNetFacility("http://localhost:8983/solr")); 
var solr = _container.Resolve<ISolrOperations<Document>>(); 
solr.Delete(SolrQuery.All); 

var conn = _container.Resolve<ISolrConnection>(); 

var docs = from o in Documents 
      where o.Attaches.Count > 0 
      select o; 

foreach (var doc in docs) 
{ 
    foreach (var att in doc.Attaches) 
    { 
     try 
     { 
      var file = Directory.GetFiles("C:\\Attachments\\" + doc.Id); 
      foreach (var s in file) 
      { 
       var a = File.ReadAllText(s); 
       conn.Post("/update", a);  
      } 

     } 
     catch (Exception) 
     {   
      throw; 
     } 
    } 
} 
solr.Commit(); 
solr.BuildSpellCheckDictionary(); 

如代碼來描述,我在尋找文件修補並直接從磁盤添加文件內容。但是,當我張貼文件的文本到Solr,我收到thie錯誤:

<?xml version="1.0" encoding="UTF-8"?> 
<response> 
    <lst name="responseHeader"> 
     <int name="status">400</int><int name="QTime">2</int> 
    </lst> 
    <lst name="error"> 
     <str name="msg">Unexpected character 'Т' (code 1058/0x422) in prolog; expected '&lt;' 
at [row,col {unknown-source}]: [1,1]</str> 
     <int name="code">400</int> 
    </lst> 
</response> 

而且我有這樣的問題:

  1. 我可以張貼到索引純文本,而不是XML?
  2. 我必須序列化我的數據對象來索引它們嗎?如果是,我如何在「附加」類中表示文件?

回答

2

回答您的問題:

  1. 是的,你可以發佈純文本索引。
  2. 您發佈的項目必須是序列化的(默認爲XML,但也可以使用JSON)以將其添加到索引。

從您的示例代碼,它看起來像只對索引文件的純文本感興趣。基於此,我將創建以下類將數據傳遞給Solr。

public class IndexItem 
    { 
     [SolrField("id")] 
     public string Id { get; set; } 

     [SolrField("content")] 
     public string Content { get; set; } 
    } 

使用此類爲每個讀取的文件存儲Id(必須是唯一值)。文件名(也包括路徑)可能足夠獨特。

您的示例更改爲以下:

_container.AddFacility("solr", 
    new SolrNetFacility("http://localhost:8983/solr")); 
var solr = _container.Resolve<ISolrOperations<IndexItem>>(); 
solr.Delete(SolrQuery.All); 

var docs = from o in Documents 
      where o.Attaches.Count > 0 
      select o; 

foreach (var doc in docs) 
{ 
    foreach (var att in doc.Attaches) 
    { 
     try 
     { 
      var file = Directory.GetFiles("C:\\Attachments\\" + doc.Id); 
      foreach (var s in file) 
      { 
         var indexItem = new IndexItem(); 
         indexItem.Id = s.FileName; 
         indexItem.Content = File.ReadAllText(s); 
         solr.Add(indexItem);  
      } 

     } 
     catch (Exception) 
     {   
      throw; 
     } 
    } 
} 
solr.Commit(); 
solr.BuildSpellCheckDictionary(); 

如果需要指數爲每個文件更多的附加屬性,你可以將它們添加到IndexItem類,因爲我注意到,你對名稱和CREATEDATE性質上面的文檔類。您只需將映射提供給Solr,以便將它們存儲在適當的Solr字段中。請參閱SolrNet Mapping頁面瞭解更多詳情。

+0

佩奇,thnx爲答案。但我怎樣才能發送「文檔」類與所有細節「附加」類?我必須將它們序列化爲一個xml文件嗎?以及我如何設置Solr.NET _schema.xml_中的字段?在文檔中,**多值**字段描述爲** ICollection **,但在我的情況下,它是** ICollection **。 – lewis 2013-02-19 18:58:45

1

我想你打算提取純文本,HTML,DOC和其他豐富的文件。而您的錯誤消息來自XML解析器,試圖解析不是XML的東西。

使用extracting request handler其設置爲/update/extract URL

相關問題