2013-02-08 16 views
9

私はelasticsearch/NESTを使ってpdfドキュメントのインデックスを作成しようとしています。ElasticSearch&attachment type(NEST C#)

ファイルのインデックスは作成されますが、検索結果は0ヒットで返されます。

私は(base64でエンコードされたコンテンツなし)のみのドキュメントIDとハイライトの結果

を返すために、検索結果を必要とする

ここではコードです:

私は、ここに任意の助けを感謝します

おかげで、

class Program 
{ 
    static void Main(string[] args) 
    { 
     // create es client 
     string index = "myindex"; 

     var settings = new ConnectionSettings("localhost", 9200) 
      .SetDefaultIndex(index); 
     var es = new ElasticClient(settings); 

     // delete index if any 
     es.DeleteIndex(index); 

     // index document 
     string path = "test.pdf"; 
     var doc = new Document() 
     { 
      Id = 1, 
      Title = "test", 
      Content = Convert.ToBase64String(File.ReadAllBytes(path)) 
     }; 

     var parameters = new IndexParameters() { Refresh = true }; 
     if (es.Index<Document>(doc, parameters).OK) 
     { 
      // search in document 
      string query = "semantic"; // test.pdf contains the string "semantic" 

      var result = es.Search<Document>(s => s 
       .Query(q => 
        q.QueryString(qs => qs 
         .Query(query) 
        ) 
       ) 
       .Highlight(h => h 
        .PreTags("<b>") 
        .PostTags("</b>") 
        .OnFields(
         f => f 
         .OnField(e => e.Content) 
         .PreTags("<em>") 
         .PostTags("</em>") 
        ) 
       ) 
      ); 

      if (result.Hits.Total == 0) 
      { 
      } 
     } 
    } 
} 

[ElasticType(
    Name = "document", 
    SearchAnalyzer = "standard", 
    IndexAnalyzer = "standard" 
)] 
public class Document 
{ 
    public int Id { get; set; } 

    [ElasticProperty(Store = true)] 
    public string Title { get; set; } 

    [ElasticProperty(Type = FieldType.attachment, 
     TermVector = TermVectorOption.with_positions_offsets)] 
    public string Content { get; set; } 
} 
+0

、上

client.CreateIndex("index-name", c => c .AddMapping<Document>(m => m.MapFromAttributes()) ); 

インデックスアイテム

string path = "test.pdf"; var attachment = new Attachment(); attachment.Content = Convert.ToBase64String(File.ReadAllBytes(path)); attachment.ContentType = "application/pdf"; attachment.Name = "test.pdf"; var doc = new Document() { Id = 1, Title = "test", File = attachment }; client.Index<Document>(item); 

検索は、マッパー、添付ファイルがes.ymlを使用して(インストールおよびロードされたプラグインを確認しマッパーをアタッチメント)。それでも、私のpdfに含まれる言葉のヒットはありません。私はこの主題(stackoverflow&others)の答えをgoogled&カールの例だけで、使用例はC#/ NESTを使用していませんでした。 (ちょうどメモ:document.title( 'test.pdf')を検索するとき、私はドキュメントを元に戻しますが、 'test'を検索するとヒットしません。 –

+0

私はこの明日のために統合テストを作成して質問に答えようとしています。私は早く答えることができません。 –

+1

この質問の更新情報 – slimflem

答えて

1

// I FSRiverプラグイン使用しています - https://github.com/dadoonet/fsriver/

void Main() 
{ 
    // search in document 
    string query = "directly"; // test.pdf contains the string "directly" 
    var es = new ElasticClient(new ConnectionSettings(new Uri("http://*.*.*.*:9200")) 
     .SetDefaultIndex("mydocs") 
     .MapDefaultTypeNames(s=>s.Add(typeof(Doc), "doc"))); 
     var result = es.Search<Doc>(s => s 
     .Fields(f => f.Title, f => f.Name) 
     .From(0) 
     .Size(10000) 
      .Query(q => q.QueryString(qs => qs.Query(query))) 
      .Highlight(h => h 
       .PreTags("<b>") 
       .PostTags("</b>") 
       .OnFields(
        f => f 
        .OnField(e => e.File) 
        .PreTags("<em>") 
        .PostTags("</em>") 
       ) 
      ) 
     ); 
} 

[ElasticType(Name = "doc", SearchAnalyzer = "standard", IndexAnalyzer = "standard")] 
public class Doc 
{ 
    public int Id { get; set; } 

    [ElasticProperty(Store = true)] 
    public string Title { get; set; } 

    [ElasticProperty(Type = FieldType.attachment, TermVector = TermVectorOption.with_positions_offsets)] 
    public string File { get; set; } 
    public string Name { get; set; } 
} 
0

を、私は同じに取り組んでいますので、今、私はこの http://www.elasticsearch.cn/tutorials/2011/07/18/attachment-type-in-action.html

をしようとしていますこの記事では、あなたが正しいマッピングに

を行う必要があり、問題

有料attensionを説明します

"title" : { "store" : "yes" }, 
"file" : { "term_vector":"with_positions_offsets", "store":"yes" } 

NEST APIでこれを行う方法を理解し、この投稿を更新しようとします。

+0

動作させるための更新情報 – bayCoder

-1

アイテムを索引付けする前に、次のようなマッピングを追加する必要があります。

client.CreateIndex("yourindex", c => c.NumberOfReplicas(0).NumberOfShards(12).AddMapping<AssetSearchEntryModels>(m => m.MapFromAttributes())); 
8

ES

bin/plugin -install elasticsearch/elasticsearch-mapper-attachments/2.3.2 

あなたとインデックス付けされているドキュメントクラスにプロパティを追加するには、添付ファイルのプラグインのドキュメント

public class Attachment 
    { 
     [ElasticProperty(Name = "_content")] 
     public string Content { get; set; } 

     [ElasticProperty(Name = "_content_type")] 
     public string ContentType { get; set; } 

     [ElasticProperty(Name = "_name")] 
     public string Name { get; set; } 
    } 

にマップアタッチメントクラスの作成を添付プラグインをインストールして再起動「File」という名前と正しいマッピング

[ElasticProperty(Type = FieldType.Attachment, TermVector = TermVectorOption.WithPositionsOffsets, Store = true)] 
    public Attachment File { get; set; } 

クラスのインスタンスのインデックスを作成する前に、インデックスを明示的に作成します。これをしないと、動的マッピングが使用され、属性マッピングは無視されます。将来マッピングを変更する場合は、常にインデックスを再作成してください。 plugin.mandatory::ファイルのプロパティも

var query = Query<Document>.Term("file", "searchTerm"); 

    var searchResults = client.Search<Document>(s => s 
      .From(start) 
      .Size(count) 
      .Query(query) 
); 
+0

それは私のために働く素晴らしい...ありがとう! –