1

ドキュメントをApache Solr v4.1にプッシュする単純な.NET Windowsサービスを作成しました。Solr へのアクセスには、SolrNet を使用しました。私のコードは次のとおりです。

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 イベント ログへの書き込み) から消去されます。
a) イベントログ - ドキュメントのインデックス作成の進行状況を表示
b) 「Solr Admin」ウェブアプリの「Core Admin」ページ - インデックス内のドキュメントの数を 表示

検索せずにドキュメントのインデックスを作成しているだけの場合、すべて正常に動作します。イベント ログには「7500 docs added」エントリが表示され、「Core Admin」にはnum docs = 7500が表示されます。

しかし、インデックス作成中にドキュメントを検索しようとすると、次のエラーが発生
します。たとえば、EventLog には7500 docs indexedと表示されますが、「Core Admin」には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
    });

UPD: 明確 にするために、webapp の「検索」ページに次の行があります。

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

1 に答える 1

4

最初に行うことはインデックスをクリアするため、この動作が見られます。

solr.Delete(SolrQuery.All)

これにより、インデックスからすべてのドキュメントが削除されます。したがって、インデックスの再作成が開始されると、インデックスは空になります。後続のコードでは、アイテムをバッチでインデックスに追加し直しています。ただし、インデックスに追加する新しいドキュメントは、コミットが発行されるまで、インデックスをクエリしているユーザーには表示されません。ドキュメントを追加してバッチでコミットを発行しているため、再構築中にドキュメント数が増加している理由と、すべてのドキュメントが表示されない理由が説明されています。最後のコミットが発行されるまで、インデックス内のカウントと合計ドキュメントは 7500 になりません。

これを軽減するためのオプションがいくつかあるかもしれません。

  1. commitWithinまたはSolr への自動ソフト コミットを使用して、Solr へのソフト コミットを発行します。AddParameterCommitWithin は、SolrNet の Add メソッドのオプションとしてサポートされています。solr.Add(docs.ToList()[i], new AddParameters{ CommitWithin = 3000});Solr に 3 秒以内にこのアイテムのバッチをコミットするように指示する発行を発行できます。
  2. Solr コアを使用して、ユーザーが検索する「アクティブ」コアを用意し、ログ データを「スタンバイ」コアにリロードします。スタンバイ コアへのロード プロセスが完了したら、コアをSWAPするコマンドを発行できます。これは、どのユーザーに対しても完全に透過的です。CoreAdmin コマンドは SolrNet でもサポートされています。例については、 SolrCoreAdminFixture.csのテストを参照してください。

お役に立てれば。

于 2013-03-12T18:45:41.813 に答える