3

次のサンプル mappipng があります。

{
    "本" : {
        "プロパティ" : {
                        "作者": { "タイプ": "文字列" },
                        「タイトル」:{「タイプ」:「文字列」}、
                        "レビュー" : {
                                "プロパティ" : {
                                        "url": { "タイプ": "文字列" },
                                        「スコア」:{「タイプ」:「整数」}
                                }
                        }、
                        "チャプター": {
                                "include_in_root": 1,
                                「タイプ」:「入れ子」、
                                "プロパティ" : {
                                        「名前」:{「タイプ」:「文字列」}
                                }
                        }
                }
        }
}

レビューの数、つまり「レビュー」配列の長さに関するファセットを取得したいと思います。たとえば、私が必要とする口頭での結果は次のとおりです。

私は次の統計的ファセットを試しています:

{
    「クエリ」: {
        "match_all": {}
    }、
    "ファセット": {
        "stat1": {
            "statistical": {"script": "doc['reviews.score'].values.size()"}
        }
    }
}

しかし、それは失敗し続けます:

{
  "エラー": "SearchPhaseExecutionException[フェーズ [query_fetch] の実行に失敗しました。完全な失敗; shardFailures {[mDsNfjLhRIyPObaOcxQo2w][facettest][0]: QueryPhaseExecutionException[[facettest][0]: query[ConstantScore(NotDeleted(cache(org.elasticsearch) .index.search.nested.NonNestedDocsFilter@a2a5984b)))],from[0],size[10]: クエリに失敗しました [メイン クエリの実行に失敗しました]]; ネストされた: PropertyAccessException[[エラー: アクセスできませんでした: レビュー; でクラス: org.elasticsearch.search.lookup.DocLookup]
[近く: {... doc[reviews.score].values.size() ....}]
                 ^
[行: 1、列: 5]]; }]",
  「ステータス」:500
}

どうすれば目標を達成できますか?

エラスティックサーチのバージョンは 0.19.9 です。

ここに私のサンプルデータがあります:

{
        "作者" : "マーク・トウェイン",
        "title" : "トム・ソーヤーの冒険",
        "レビュー" : [
                {
                        "url" : "amazon.com",
                        「スコア」:10
                }、
                {
                        "url" : "www.barnesandnoble.com",
                        「スコア」:9
                }
        ]、
        "章" : [
                { "名前" : "第 1 章" }, { "名前" : "第 2 章" }
        ]
}

{
        "作者" : "ジャック・ロンドン",
        "title" : "野生の呼び声",
        "レビュー" : [
                {
                        "url" : "amazon.com",
                        「スコア」:8
                }、
                {
                        "url" : "www.barnesandnoble.com",
                        「スコア」:9
                }、
                {
                        "url" : "www.books.com",
                        「スコア」:5
                }
        ]、
        "章" : [
                { "名前" : "第 1 章" }, { "名前" : "第 2 章" }
        ]
}
4

1 に答える 1

6

curl を使用してクエリを実行しているようで、この curl ステートメントは次のようになります: curl localhost:9200/my-index/book -d '{....}'

ここでの問題は、アポストロフィを使用してリクエストの本文をラップしているため、リクエストに含まれるすべてのアポストロフィをエスケープする必要があることです。したがって、スクリプトは次のようになります。

{"script" : "doc['\''reviews.score'\''].values.size()"}

また

{"script" : "doc[\"reviews.score"].values.size()"}

2 番目の問題は、説明から、統計ファセットではなく、ヒストグラム ファセットまたは範囲ファセットを探しているように見えることです。したがって、次のようなことを試すことをお勧めします。

curl "localhost:9200/test-idx/book/_search?search_type=count&pretty" -d '{
    "query" : {
        "match_all" : {}
    },
    "facets" : {
        "histo1" : {
            "histogram" : {
                "key_script" : "doc[\"reviews.score\"].values.size()",
                "value_script" : "doc[\"reviews.score\"].values.size()",
                "interval" : 1
            }
        }        
    }
}'

3 番目の問題は、ファセット内のスクリプトが結果リスト内のすべてのレコードに対して呼び出されることです。結果が多数ある場合は、非常に長い時間がかかる可能性があります。number_of_reviewsそのため、クライアントによるレビューの数を入力する必要があるという追加のフィールドにインデックスを作成することをお勧めします。次に、クエリは次のようになります。

curl "localhost:9200/test-idx/book/_search?search_type=count&pretty" -d '{
    "query" : {
        "match_all" : {}
    },
    "facets" : {
        "histo1" : {
            "histogram" : {
                "field" : "number_of_reviews"
                "interval" : 1
            }
        }        
    }
}'
于 2013-01-30T21:12:36.683 に答える