2013-02-08 3 views
9

Я пытаюсь проиндексировать pdf-документ с помощью elasticsearch/NEST.ElasticSearch & attachment type (NEST C#)

Файл проиндексирован, но результаты поиска возвращаются с 0 ударами.

мне нужен результат поиска, чтобы вернуть только документ, удостоверяющий личность, и результат выделения

(без содержания base64)

Вот код:

Я признателен за любую помощь здесь,

Спасибо,

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

Кроме того, проверяется, что картограф-вложение плагина установлен и загружено (с помощью es.yml: plugin.mandatory: картограф -attachments). Тем не менее, никаких хитов для слов, содержащихся в моем pdf. Я искал ответы на эту тему (stackoverflow & others) и только придумал примеры скручивания, не использовал пример использования 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

Эта статья объясняет Issue

платить 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

Установите Attachment плагин и перезапустить ES

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

Создание Attachment класса, который отображает на Attachment Plugin Документация

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; } 
    } 

Добавьте свойство в классе документа вы Индексация с название «Файл» и правильное картирование

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

Создайте свой индекс явно, прежде чем индексировать любые экземпляры вашего класса. Если вы этого не сделаете, он будет использовать динамическое сопоставление и игнорировать сопоставление атрибутов. Если вы измените свое сопоставление в будущем, всегда создавайте индекс.

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); 

Поиск по свойству файла

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

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

Отлично, это работает для меня .... Спасибо! –

Смежные вопросы