代码之家  ›  专栏  ›  技术社区  ›  lewis

数据库中的索引数据,文件存储在文件系统中

  •  0
  • lewis  · 技术社区  · 12 年前

    我正试图在我的.NET应用程序中使用ApacheSolr作为全文搜索引擎(通过 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时,我收到了一个错误:

    <?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. 我必须序列化我的数据对象以对它们进行索引吗?如果是,我必须如何在“Attach”类中表示文件?
    2 回复  |  直到 12 年前
        1
  •  2
  •   Paige Cook    12 年前

    要回答您的问题:

    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类中,因为我注意到您在上面的Document类中有Name和CreateDate属性。您只需要提供到Solr的映射,以便将它们存储在适当的Solr字段中。请参阅 SolrNet Mapping 页面了解更多详细信息。

        2
  •  1
  •   Jesvin Jose    12 年前

    我猜您打算提取纯文本、HTML、DOC和其他丰富的文档。您的错误消息来自一个试图解析非XML内容的XML解析器。

    使用 extracting request handler 设置为 /update/extract 统一资源定位地址