ElasticSearch & attachment type (NEST C#)

后端 未结 4 1947
孤城傲影
孤城傲影 2020-12-09 21:07

I\'m trying to index a pdf document with elasticsearch/NEST.

The file is indexed but search results returns with 0 hits.

I need the search result to return o

相关标签:
4条回答
  • 2020-12-09 21:41

    I am working on the same so now i am trying this http://www.elasticsearch.cn/tutorials/2011/07/18/attachment-type-in-action.html

    This article explains issue

    pay attension that you should do correct mapping

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

    I will try to figure out how to do that with NEST api and update this post

    0 讨论(0)
  • 2020-12-09 21:44

    Install the Attachment Plugin and restart ES

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

    Create an Attachment Class that maps to the Attachment Plugin Documentation

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

    Add a property on the Document class you are indexing with the name "File" and correct mapping

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

    Create your index explicitly before you index any instances of your class. If you don't do this, it will use dynamic mapping and ignore your attribute mapping. If you change your mapping in the future, always recreate the index.

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

    Index your item

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

    Search on the File property

      var query = Query<Document>.Term("file", "searchTerm");
    
      var searchResults = client.Search<Document>(s => s
              .From(start)
              .Size(count)
              .Query(query)
      );
    
    0 讨论(0)
  • 2020-12-09 21:48

    // I am using FSRiver plugin - 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 讨论(0)
  • 2020-12-09 21:52

    You need to add the mapping like below before you index items.

    client.CreateIndex("yourindex", c => c.NumberOfReplicas(0).NumberOfShards(12).AddMapping<AssetSearchEntryModels>(m => m.MapFromAttributes()));
    
    0 讨论(0)
提交回复
热议问题