C# 索引时查询Solr会导致索引中的文档丢失

C# 索引时查询Solr会导致索引中的文档丢失,c#,.net,solr,solrnet,C#,.net,Solr,Solrnet,我编写了简单的.NETWindows服务,它将文档推送到ApacheSolrV4.1。为了访问Solr,我使用了SolrNet。我的代码是: var solr=_container.Resolve(); solr.Delete(SolrQuery.All); var docs=来自文档中的o orderby o.Id升序 选择o; 对于(var i=0;i0) { foreach(在docs.ToList()[i].DocumentAttachments中附加var) { 使用(var fil

我编写了简单的.NETWindows服务,它将文档推送到ApacheSolrV4.1。为了访问Solr,我使用了SolrNet。我的代码是:

var solr=_container.Resolve();
solr.Delete(SolrQuery.All);
var docs=来自文档中的o
orderby o.Id升序
选择o;
对于(var i=0;i0)
{
foreach(在docs.ToList()[i].DocumentAttachments中附加var)
{
使用(var fileStream=System.IO.File.OpenRead(…)
{
var extractResult=solr.Extract(
新的ExtractParameters(fileStream,attach.Id.ToString(CultureInfo.InvariantCulture))
{
ExtractFormat=ExtractFormat.Text,
ExtractOnly=true
}
);
文本。添加(提取结果。内容);
}
}
}
docs.ToList()[i].GetFilesText=text;
solr.Add(docs.ToList()[i]);
如果(i%\u commitStep==0)
{
solr.Commit();
solr.Optimize();
}
}
solr.Commit();
solr.Optimize();
solr.BuildSpellCheckDictionary();
“Document.GetFilesText”-这是一个存储从pdf文件中提取的文本的字段。
此示例已从日志记录方法(写入Windows事件日志)中清除。编制索引时,我被监视:
a) 事件日志-显示文档索引进度
b) “Solr Admin”webapp中的“Core Admin”页面-显示索引中的文档数

当我只是索引文档而没有搜索时,一切正常-事件日志显示“添加7500个文档”条目,“核心管理员”显示num docs=7500

但是,如果在索引期间尝试搜索文档,则会出现以下错误:
-搜索结果不包含所有传递的文档
-“核心管理员”重置num docs值。例如,EventLog显示索引了7500个文档,但“核心管理员”显示num docs=23。每次查询Solr时,num docs都会重置

我的查询代码:

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
    });
searchPhrase=textBox1.Text;
var documents=Solr.Query(新的SolrQuery(searchPhrase),新的QueryOptions
{
Highlight=新的HighlightingParameters
{
UsePhraseHighlighter=true,
Fields=新集合{“Field1”、“Field2”、“Field3”},
期前=”,
后置词=“”
},
行=100
});

UPD:把事情弄清楚 我的webapp的“搜索”页面中有以下几行:

公共类MyController:Controller
{
公共isoroperties Solr{get;set;}
公共MyController()
{
//_solr=solr;
}
//
//获取:/Search/My/
公共行动结果索引()
{
Solr.Delete(SolrQuery.All);
返回视图();
}
...

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

您会看到这种行为,因为您要做的第一件事就是清除索引

solr.Delete(SolrQuery.All)
这将从索引中删除所有文档。因此,一旦重新索引开始,索引将为空。 现在,在后续代码中,您将分批将项目添加回索引中。但是,在发出a之前,查询索引的用户将看不到您添加到索引中的任何新文档。由于您在期间分批添加文档并发出提交,这就解释了在重建a时文档计数增加的原因nd为什么不是所有文档都可见。在发出最后一次提交之前,索引中的计数和文档总数不会达到7500

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

  • Issue soft commits to Solr using or to Solr.CommitWithin作为可选的
    AddParameter
    支持到SolrNet中的Add方法。您可以发出
    Solr.Add(docs.ToList()[i],new AddParameters{CommitWithin=3000});
    ,告诉Solr在3秒内提交这批项目
  • 用于拥有用户正在搜索的“活动”内核,并将日志数据重新加载到“备用”中core。完成对备用core的加载过程后,您可以向core发出命令,这对任何用户都是完全透明的。SolrNet中也支持CoreAdmin命令,有关示例,请参阅中的测试

  • 希望这有帮助。

    您看到了这种行为,因为您要做的第一件事就是清除索引

    solr.Delete(SolrQuery.All)
    
    这将从索引中删除所有文档。因此,一旦重新索引开始,索引将为空。 现在,在后续代码中,您将分批将项目添加回索引中。但是,在发出a之前,查询索引的用户将看不到您添加到索引中的任何新文档。由于您在期间分批添加文档并发出提交,这就解释了在重建a时文档计数增加的原因nd为什么不是所有文档都可见。在发出最后一次提交之前,索引中的计数和文档总数不会达到7500

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

  • Issue soft commits to Solr using or to Solr.CommitWithin作为可选的
    AddParameter
    支持到SolrNet中的Add方法。您可以发出
    Solr.Add(docs.ToList()[i],new AddParameters{CommitWithin=3000});
    ,告诉Solr在3秒内提交这批项目
  • 用于拥有用户正在搜索的“活动”内核,并将日志数据重新加载到“备用”中core。完成对备用core的加载过程后,您可以向core发出命令,这对任何用户都是完全透明的。SolrNet中也支持CoreAdmin命令,有关示例,请参阅中的测试
  • 希望这有帮助。

    我是斯图
    solr.Delete(SolrQuery.All)