2013-03-12 164 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