0

.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 '&lt;'
 at [row,col {unknown-source}]: [1,1]</str>
        <int name="code">400</int>
    </lst>
</response>

そして、私はこの質問があります:

  1. XML ではなくプレーン テキストをインデックスに投稿できますか?
  2. データ オブジェクトをシリアル化してインデックスを作成する必要がありますか? はいの場合、「Attach」クラスでファイルをどのように表現する必要がありますか?
4

2 に答える 2

2

質問に答えるには:

  1. はい、プレーン テキストをインデックスに投稿できます。
  2. 投稿するアイテムは、インデックスに追加するためにシリアル化する必要があります (デフォルトは XML ですが、JSON も使用できます)。

サンプル コードから、ファイルのプレーン テキストのインデックス作成だけに関心があるようです。それに基づいて、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();

ファイルごとに追加のプロパティをインデックス化する必要がある場合は、上記の Document クラスに Name プロパティと CreateDate プロパティがあることに気付いたので、それらを IndexItem クラスに追加できます。適切な Solr フィールドに格納されるように、Solr へのマッピングを提供するだけで済みます。詳細については、SolrNet マッピングページを参照してください。

于 2013-02-19T14:00:53.093 に答える
1

プレーン テキスト、HTML、DOC、その他のリッチ ドキュメントを抽出するつもりだと思います。そして、あなたのエラー メッセージは、XML パーサーが XML 以外のものを解析しようとしていることに由来しています。

URL に設定された抽出リクエストハンドラを利用する/update/extract

于 2013-02-19T12:05:07.553 に答える