我正在尝试在我的.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时,我收到了错误:
<?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 '<'
at [row,col {unknown-source}]: [1,1]</str>
<int name="code">400</int>
</lst>
</response>
我有这个问题:
答案 0 :(得分:2)
回答你的问题:
从您的示例代码中,您似乎只对索引文件的纯文本感兴趣。基于此,我将创建以下类来将数据传递给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页面。
答案 1 :(得分:1)
我猜你打算提取纯文本,HTML,DOC和其他丰富的文档。并且您的错误消息来自XML解析器,它试图解析不是XML的东西。
使用/update/extract
网址