2016-07-26 10 views
1

私のESインデックス/クラスタがスケールアップされているので(私は現在約20億ドルのドキュメントになります)、私はより重要なパフォーマンスの低下に気付きました。だから私は私の質問で私がそれらのいくつかのperfを絞ることができるかどうか見るために混乱し始めた。クエリよりもはるかに遅いElastic Searchフィルタ

私がこのようにしたとき、私はフィルタでブールクエリを使用したとき、私の結果に戻るのに約3.5〜4秒かかることに気付きました。クエリ

を使用してフィルタ

POST /backup/entity/_search?routing=39cd0b95-efc3-4eee-93d1-93e6f5837d6b 
{ 
    "query": {"bool":{"should":[],"must":[{"match_all":{}}]}}, 
    "filter": { 
    "bool": { 
     "must": [ 
     { 
      "term": { 
      "serviceId": "39cd0b95-efc3-4eee-93d1-93e6f5837d6b" 
      } 
     }, 
     { 
      "term": { 
      "subscriptionId": "3eb5021e-2f1d-4292-9fd5-95788ebfafa0" 
      } 
     }, 
     { 
      "term": { 
      "subscriptionType": 0 
      } 
     }, 
     { 
      "terms": { 
      "entityType": [ 
       "4" 
      ] 
      } 
     } 
     ] 
    } 
    } 
} 

を使用して

:私は私のクエリで同じことを行う場合しかし、それはここで

10-20msが2つのクエリです以上のようなものです

POST /backup/entity/_search?routing=39cd0b95-efc3-4eee-93d1-93e6f5837d6b 
{ 
    "query": {"bool":{"should":[],"must":[ 
     { 
      "term": { 
      "serviceId": "39cd0b95-efc3-4eee-93d1-93e6f5837d6b" 
      } 
     }, 
     { 
      "term": { 
      "subscriptionId": "3eb5021e-2f1d-4292-9fd5-95788ebfafa0" 
      } 
     }, 
     { 
      "term": { 
      "subscriptionType": 0 
      } 
     }, 
     { 
      "terms": { 
      "entityType": [ 
       "4" 
      ] 
      } 
     } 
     ]}} 
} 

私が言ったように、私がフィルターをまったく使用しない2番目の方法は、最初のクエリはほぼ4秒かかります。これは、ドキュメントが言っていることから完全に逆のようです。彼らは、フィルタは実際には非常に速くなければならず、クエリは長い時間がかかります。だから私はなぜここで正反対のことを見ているのですか?

私はインデックスマッピングで何かできますか?なぜこのようなことが起こっているのか誰かが考えているなら、私は提案を聞くのが大好きです。

おかげ

+0

あなたがそれに続くものと最初の実行を比較している場合、それは関係ありませんです。最初のフィルタはフィルタ(個々のフィルタ)をキャッシュし、他のフィルタはキャッシュされたフィルタを使用します。 –

+0

**同じ**クエリ(フィルタクエリではない)を複数回実行すると、同じ3-4秒の応答時間が得られますか? –

+0

私は平均応答時間を約10回の呼び出しで比較しています –

答えて

1

ルートfilterの要素は、実際にはanother name for post_filter elementです。なんとなく、it was supposed to be removed (the filter) in ES 1.1しかしそれはスリップして、2.xバージョンにも存在します。

ただし、ES5では完全に削除されます。

したがって、最初のクエリは「フィルタ」クエリではありません。それは結果が(該当する場合)集計で後で使用され、その後post_filter/filterが結果に適用されるクエリです。ですから、基本的にはそこに2段階のプロセスがあります。その性能hereについてhttps://www.elastic.co/guide/en/elasticsearch/reference/1.5/search-request-post-filter.html

より:

我々は、タグフィルタのキャッシュ可能性を獲得しているが、我々は潜在的に有意な得点のコストが増加しています。ポストフィルタは、集計をフィルタリングする必要があるが、フィルタリングするヒットが必要な場合に便利です。ファセットや集計がない場合は、post_filter(または廃止予定の最上位シノニムフィルタ)を使用しないでください。

適切なフィルタクエリは次のようになります。

{ 
    "query": { 
    "filtered": { 
     "query": { 
     "bool": { 
      "should": [], 
      "must": [ 
      { 
       "match_all": {} 
      } 
      ] 
     } 
     }, 
     "filter": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "serviceId": "39cd0b95-efc3-4eee-93d1-93e6f5837d6b" 
       } 
      }, 
      { 
       "term": { 
       "subscriptionId": "3eb5021e-2f1d-4292-9fd5-95788ebfafa0" 
       } 
      }, 
      { 
       "term": { 
       "subscriptionType": 0 
       } 
      }, 
      { 
       "terms": { 
       "entityType": [ 
        "4" 
       ] 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
-1

フィルタ高速です。問題は、フィルタケースにmatch_allというクエリを含めることです。これはにすべて一致します。20億の文書。セット操作をフィルタに対して行う必要があります。フィルタテストでquery部分を省略すると、結果がはるかに速くなることがわかります。

+0

私はそれも考えましたが、クエリを省略しても同じパフォーマンスを持っています –

+0

これは本当に奇妙です。フィルタのクエリ部分を完全に省略することもできますか?フィルタはスコアリングのないクエリであるため、高速化する必要があります。それもキャッシュされています。 – Haney

関連する問題