2013-03-12 163 views
1

我写了一个简单的.NET Windows服务,它将文档推送到Apache Solr v4.1。为了访问Solr,我使用了SolrNet。我的代码是: 索引时查询Solr导致索引丢失文档

var solr = _container.Resolve<ISolrOperations<Document>>();    
solr.Delete(SolrQuery.All); 

var docs = from o in documents 
      orderby o.Id ascending 
      select o; 

for (var i = 0; i < docs.Count(); i++) 
{ 
    var texts = new List<string>(); 
    if (docs.ToList()[i].DocumentAttachments.Count > 0) 
    { 
     foreach (var attach in docs.ToList()[i].DocumentAttachments) 
     { 
      using (var fileStream = System.IO.File.OpenRead(...)) 
      { 
       var extractResult = solr.Extract(
        new ExtractParameters(fileStream, attach.Id.ToString(CultureInfo.InvariantCulture)) 
        { 
         ExtractFormat = ExtractFormat.Text, 
         ExtractOnly = true 
        } 
       ); 
       texts.Add(extractResult.Content);     
      } 
     } 
    } 

    docs.ToList()[i].GetFilesText = texts; 
    solr.Add(docs.ToList()[i]); 

    if (i % _commitStep == 0) 
    { 
     solr.Commit(); 
     solr.Optimize(); 
    } 
} 

solr.Commit(); 
solr.Optimize(); 
solr.BuildSpellCheckDictionary(); 

“Document.GetFilesText” - 这是一个字段,用于存储文本,从PDF文件中提取。
本示例已从日志记录方法中清除(写入Windows事件日志)。虽然索引,我看着于:
一)事件日志 - 显示文件索引进步
二)在“Solr管理” web应用“核心管理”页面 - 显示的文件数在指数

当我只是索引文件,没有搜索,所有作品都正确 - 事件日志显示“7500 docs added”条目,“Core Admin”显示num docs = 7500

但是,如果我尝试索引中搜索文件,我有这些错误:
- 搜索结果包含了不是所有的传递公文
- “核心管理”重置NUM文档值。例如,EventLog显示7500文档索引为,但“Core Admin”显示num docs = 23。和num文档重新设置每次,当我查询Solr

我的查询代码:

searchPhrase = textBox1.Text; 
var documents = Solr.Query(new SolrQuery(searchPhrase), new QueryOptions 
    { 
     Highlight = new HighlightingParameters 
      { 
       UsePhraseHighlighter = true, 
       Fields = new Collection<string> { "Field1", "Field2", "Field3" }, 
       BeforeTerm = "<b>", 
       AfterTerm = "</b>" 
      }, 
     Rows = 100 
    }); 

UPD:为了更清楚地 我在我的web应用程序的 “搜索” 页面这些行:

public class MyController : Controller 
{ 
    public ISolrOperations<Document> Solr { get; set; } 

    public MyController() 
    { 
     //_solr = solr; 
    } 

    // 
    // GET: /Search/My/ 
    public ActionResult Index() 
    { 
     Solr.Delete(SolrQuery.All); 

     return View(); 
    } 
... 

而且,打开此页面在浏览器中,导致Solr索引完全丢失文档。:-)

回答

4

您正在看到此行为,因为您要做的第一件事是清除索引。

solr.Delete(SolrQuery.All) 

这将删除索引中的所有文档。所以一旦重新索引开始,索引将是空的。 现在在您的后续代码中,您正在将这些项目批量添加到索引中。但是,在发布commit之前,查询索引的用户将无法看到添加到索引的任何新文档。由于您正在添加文档并在批处理中发出提交,这就解释了在重建期间文档数量不断增加的原因以及为什么不能看到所有文档。在发布最后一次提交之前,索引中的计数和文档总数不会是7500。

可能有几个选项可以帮助您缓解这种情况。

  1. 使用commitWithinauto soft commits发布到Solr的软提交给Solr。 CommitWithin作为可选的AddParameter支持SolrNet中的Add方法。你可以发出solr.Add(docs.ToList()[i], new AddParameters{ CommitWithin = 3000});这会告诉Solr在3秒内提交这批物品。
  2. 使用Solr Cores有一个“活动”核心,用户正在搜索并将日志数据重新加载到“备用”核心。一旦完成对待机核心的加载过程,您可以发出命令给核心,这对任何用户都是完全透明的。 Coreadmin命令在SolrNet中也受支持,请参阅SolrCoreAdminFixture.cs中的测试。

希望这会有所帮助。

+0

我从solrnet例子中愚蠢地copypasted代码:-) Thnx,Paige! – lewis 2013-03-13 10:21:45

+0

Paige,我用webapp源代码更新了我的最新帖子。 – lewis 2013-03-13 10:33:09