3

現在、エラスティック検索の使用に問題があります。検索を実行しようとして、返されるフィールドのサブセットのみが必要な場合、フィールドがネストされている場合は、ドット表記を使用してフィールドを指定する必要があります。これは、私のcouchDBドキュメントをマップするマッパーjsonドキュメントのサンプルです:

{
    "product": {
        "_type": {"store": "yes"},
        "_source": {"compress": true},
        "index_analyzer": "standard",
        "search_analyzer": "standard",
        "dynamic_date_formats": ["date_time_no_millis", "date_optional_time"],
        "properties": {
              "_id": {"type": "string", "store": "yes", "index": "not_analyzed"},
            "key": {"type": "string", "store": "yes"},
            "content": {
                "type": "object",
                "path": "just_name",
                "properties": {
                    "key": {"type": "string", "store": "yes"},
                    "name": {"type": "string", "store": "yes", "index_name": "name"},
                    "description": {"type": "string", "store": "yes", "index_name": "description"},
                    "brand": {
                        "type": "object",
                        "index_name": "brand",
                        "properties": {
                            "abbreviation": {"type": "string", "store": "yes", "index_name": "brand_abbreviation"},
                            "name": {"type": "string", "store": "yes", "index_name": "brand_name"}
                        }
                    }
                                }
                        }
                 }
          }
}

_id への参照は単純な _id になりますが、コンテンツ内の名前を参照したい場合は、それを content.name として参照する必要があります。これに関する問題は、検索出力が出力されると、json 出力にフィールド名が「content.name」として含まれることです。

これを「コンテンツ」なしで「名前」に名前を変更することは可能ですか。プレフィックス?ご覧のとおり、index_name を指定しようとしましたが、役に立たないようでした。

4

1 に答える 1

4

これを行うために使用できますpartial_fields

たとえば、次のようにドキュメントにインデックスを付けるとします。

curl -XPUT 'http://127.0.0.1:9200/test/test/1?pretty=1'  -d '
{
   "email" : "john@foo.com",
   "name" : "john",
   "foo" : {
      "bar" : {
         "baz" : 1
      }
   }
}
'

次のように、必要なフィールド/オブジェクトを含めることができます。

curl -XGET 'http://127.0.0.1:9200/test/test/_search?pretty=1'  -d '
{
   "partial_fields" : {
      "doc" : {
         "include" : [
            "name",
            "foo.*"
         ]
      }
   }
}
'

次のような結果が得られます: (欠落しているemailフィールドに注意してください。そのフィールドfooはハッシュのままです - ドット表記で平坦化されていません)

{
   "hits" : {
      "hits" : [
         {
            "_score" : 1,
            "fields" : {
               "doc" : {
                  "name" : "john",
                  "foo" : {
                     "bar" : {
                        "baz" : 1
                     }
                  }
               }
            },
            "_index" : "test",
            "_id" : "1",
            "_type" : "test"
         }
      ],
      "max_score" : 1,
      "total" : 1
   },
   "timed_out" : false,
   "_shards" : {
      "failed" : 0,
      "successful" : 5,
      "total" : 5
   },
   "took" : 1
}

補足として、マッピングに関するいくつかのコメント:

  • あなたの_idフィールド(これは、外部IDではなく、elasticsearch IDであることを意図していると思います)が間違ったレベルにあります_type.. それが外部 ID である場合、適切なレベルにあります。
  • なぜすべてのフィールドを保存するのですか? 実際には必要ありません。余分なリソースを使用するだけです。大規模なフィールドがない限り_source、個々のフィールドごとにディスクをヒットするよりも、そのフィールドだけを取得して解析する方がはるかに高速です。
于 2012-08-13T14:28:30.890 に答える