2016-11-09 4 views
0

私は2.7Mドキュメントのインデックスを持っています。質問があります:弾性検索クエリ2.7M文書、60ミリ秒。それは大丈夫ですか、それとも速くなるのでしょうか?

GET ad_index/ad_type/_search 
{ 
    "size": 20, 
    "sort": { 
    "until": "desc" 
    }, 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "term": { 
      "state": 2 
      } 
     }, 
     { 
      "range": { 
      "until": { 
       "gte": "now" 
      } 
      } 
     } 
     ] 
    } 
    }, 
    "aggs" : { 
    "categories": { 
     "terms": { 
     "field": "category_id", 
     "size": 2000 
     } 
    } 
    } 
} 

このクエリには、サブクエリがありません。 私は1つのシャードと1つのレプリカで1つのノードを持っています。

クエリ時間 - 60 ms。集約なし - 40 ms。 ヒット数〜50000.

これは大丈夫ですか、それとも速くなるのでしょうか?私は10ミリ秒を望む。私は<をMySQLで10ms得ます。

私はES 2.4を使用します。インデックスのサイズは1.34 GBです。私はスコアに興味がありません。

UPD。

マイマップ:

{ 
    "ad_index": { 
    "mappings": { 
     "ad_type": { 
     "properties": { 
      "customer_id": { 
      "type": "long" 
      }, 
      "deleted": { 
      "type": "long" 
      }, 
      "dynamic_fields": { 
      "properties": { 
       "-icq-3": { 
       "type": "string" 
       }, 
       "phone-3": { 
       "type": "string" 
       } 
       "email-3": { 
       "type": "string" 
       } 

       //and 100 more sparse dynamic fields 

      }, 
      "id": { 
      "type": "long" 
      }, 
      "category_id": { 
      "type": "long" 
      }, 
      "until": { 
      "type": "date", 
      "format": "yyyy-MM-dd HH:mm:ss" 
      }, 
      "state": { 
      "type": "long" 
      }, 
      "text": { 
      "type": "string" 
      } 
     } 
     } 
    } 
    } 
} 

その他のクエリ:

GET ad_index/ad_type/_search 
{ 
    "size": 20, 
    "sort": { 
    "until": "desc" 
    }, 
    "query": { 
    "bool": { 
     "filter": [ 
     { 
      "term": { 
      "state": 2 
      } 
     }, 
     { 
      "range": { 
      "until": { 
       "gte": "now" 
      } 
      } 
     }, 
     { 
      "terms": { 
      "category_id" : [1029, 121, ... here can be more than 200 values] 
      } 
     } 
     ] 
    } 
    }, 
    "aggs" : { 
    "categories": { 
     "terms": { 
     "field": "category_id", 
     "size": 2000 
     } 
    } 
    } 
} 

GET ad_index/ad_type/_search 
{ 
    "size": 20, 
    "sort": { 
    "until": "desc" 
    }, 
    "query": { 
    "bool": { 
     "must": [ 
     { 
     "match": { 
      "_all": "some text" 
      } 
     } 
     ], 
     "filter": [ 
     { 
      "term": { 
      "state": 2 
      } 
     }, 
     { 
      "range": { 
      "until": { 
       "gte": "now" 
      } 
      } 
     }, 
     { 
      "terms": { 
      "category_id" : [1029, 121, ... here can be more than 200 values] 
      } 
     } 
     ] 
    } 
    }, 
    "aggs" : { 
    "categories": { 
     "terms": { 
     "field": "category_id", 
     "size": 2000 
     } 
    } 
    } 
} 
+1

に何が起こっているかを確認するためにクエリをプロフィール

  • あなたはES_HEAP_SIZE(https://www.elastic.co/guide/en/elasticsearch/guide/current/heap-sizing.html)を設定することにより、メモリの適切な量を許可していることを確認してくださいあなたはElasticSearchにMySQLを比較しています? x_x –

  • +0

    これは問題ありません。私は、1億5000万のドキュメントで10以上のフィルタを使用して、大規模なクエリで40ミリ秒を得るために使用します。ドキュメントのスキーマを貼り付けることができます。また、クエリを調整することができます。あなたは単にドキュメントをフィルタリングしているので。あなたがスコアに興味がない場合は、フィルタをブール型フィルタでフィルタ内に移動し、フィルタ上で_cacheを有効にすることができます(ただし、範囲のフィルタは_cacheには適していません)。シェアマッピング/スキーマやその他のユースケースのクエリ – user3775217

    +0

    UPDセクションにいくつかの追加情報を掲載 –

    答えて

    1

    その少し遅い、あなたは単純なクエリを使用しているため。

    1. この量の文書ではシャードを試してみると、3〜5個のシャードが試されます。
    2. https://www.elastic.co/guide/en/elasticsearch/reference/2.3/search-profile.html
    +0

    ありがとうございました!私は単純なクエリの代わりを持っていますか? –

    +1

    @AntonyZh簡単なクエリでは、私はあなたが非常に簡単にクエリを行うので、クエリが良いです、私は問題がセットアップと考えているテキスト分析を使用していないことを意味します –

    +0

    @AntonyZhあなたのためのもう一つのチェックポイントを追加しました –

    関連する問題