Elasticsearch-net 5.0RC4でAttachmentの一部が結果に格納されない


(tsgkdt) #1

概要

検索結果のjsonには含まれているのに、elasticsearch-nestでアクセスした場合、AttachmentのTitleに値が格納されていない。
取得するのに必要な設定があれば教えてほしい。

試した環境

  • ElasticSearch 5.0.1 (公式のDockerイメージを利用)
  • .NETCore 1.1
  • NEST 5.0.0 RC4

再現用情報

ElasticSearchに入れたデータと手順

DELETE documents
POST documents/document/1
{
    "id" : 1,
    "path": "/a/b/c/d/",
    "attachment":{
      "author": "作者",
      "content": "I have a pen. I have an apple",
      "content_length": 12345,
      "content_type": "plain/txt",
      "date" : "2016-12-06T12:34:56Z",
      "language": "ja",
      "name": "名前",
      "title": "タイトル",
      "keywords": "キーワード",
      "indexed_chars": 12345,
      "detect_language" : "ja"
    }
}

検索クライアント側

Documentクラスは、以下のブログを参考にした。Futureのところ。


マッピングの設定をしなくても再現しているため、上のデータ投入手順では省きました。

public class Document
{
  public int Id { get; set; }
  public string Path { get; set; }
  public string Content { get; set; }
  public Attachment Attachment { get; set; }
}

そして、検索してDocumentを取得する

var connectionSettings = new ConnectionSettings(
                             new Uri("http://xxx.xxx.xxx.xxx:9200"))
                             .DisableDirectStreaming();
var client = new ElasticClient(connectionSettings);
var response = client .Get<Document>(1, idx => idx.Index("documents"));

Console.WriteLine(response.DebugInformation);

var document = response.Source;

標準出力に検索結果として取得されたJSONが以下のように表示され、Titleも取得できていますが、
documentの中のAttachmentのTitleはNullのになっています。

# Response:
{"_index":"documents","_type":"document","_id":"1","_version":1,"found":true,"_source":{
    "id" : 1,
    "path": "/a/b/c/d/",
    "attachment":{
      "author": "作者",
      "content": "I have a pen. I have an apple",
      "content_length": 12345,
      "content_type": "plain/txt",
      "date" : "2016-12-06T12:34:56Z",
      "language": "ja",
      "name": "名前",
      "title": "タイトル",
      "keywords": "キーワード",
      "indexed_chars": 12345,
      "detect_language" : "ja"
    }
  
}
}

検索結果として取得したマッピングされたDocumentオブジェクトの中身を見たとき、Title [string] : null となっています。

IMHO

Githubのレポジトリで、
取得したJSONからAttachmentを生成しているところがありますが、ここのswitch case文でtitleを判定していないので、
何も入らないのでは? と感じた次第です。


(tsgkdt) #2

補足

Nest/Mapping/Types/Specialized/Attachment.csの160行目前後にtitleのときの追加を行うと、結果に含まれるようになりました。

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
//省略
	if (reader.TokenType == JsonToken.PropertyName)
	{
		var propertyName = (string)reader.Value;
		switch (propertyName.ToLowerInvariant())
	 	{
                        /* add start*/
        		case "title":
				attachment.Title = reader.ReadAsString();
				break;
                        /* add end*/
	                case "_content":
			case "content":
//以下略

(Jun Ohtani) #3

検証ありがとうございます!
GitHubにIssueを上げていただけると助かります。


(tsgkdt) #4

Google翻訳の手を借りて登録しておきました。

ユニットテスト/Integrateテストの書き方が今一つわからなかったので、テスト/PRは出すに至らずです。


(Jun Ohtani) #5

ありがとうございます!


(system) #6

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.