9

Elasticsearch/NEST を使用して PDF ドキュメントのインデックスを作成しようとしています。

ファイルは索引付けされていますが、検索結果はヒットなしで返されます。

ドキュメント ID とハイライト結果のみを返す検索結果が必要です

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

4 に答える 4

9

Attachment Plugin をインストールして 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; }
  }

「ファイル」という名前と正しいマッピングでインデックスを作成しているドキュメント クラスにプロパティを追加します。

  [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)
  );
于 2014-09-25T16:30:42.870 に答える
1

// 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; }
}
于 2013-09-21T11:58:42.553 に答える
0

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

この記事では、問題について説明します

正しいマッピングを行う必要があることに注意してください

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

NEST APIでそれを行う方法を見つけ出し、この投稿を更新します

于 2013-12-06T09:38:39.910 に答える