ElasticSearche高性能queryとfilterクエリ文の探索

2419 ワード


リンク:http://blog.ifootsteps.com/?p=96
ElasticSearchクエリ文は主に二つがあります.一つはqueryで、一つはfilterです.queryには採点過程が必要ですので、filterによっては遅くなります.普通のmatchはまたtermsより遅くなります.だから、filterとtermが一緒になると効率がもっと上がります.
たとえば:
 
GET index/type/_search
{
  "query": {
    "filtered": {
      "filter": {
        "query": {
          "terms": {
            "name": [
              "   ",
              "  ",
              "   ",
              " "
            ],
            "minimum_match": 2
          }
        }
      }
    }
  }
}
 現在のminimum_matchの値はtermsの数/2を上にセットします.
 
この文は現在使用されている最高効率の無採点文です.java転化は簡単です.例を貼りません.
 
もう一つは採点付きのquery文です.
 
GET index/type/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "terms": {
            "name": [
              "   ",
              "  ",
              " "
            ],
           "minimum_match":2
          }
        }
      ]
    }
  }
}
 この2つは両方利用するtermsで、つまり照会する時はelasticsearchの分詞プラグインを利用して、照会する前に予分詞を使って、分詞の結果を調べます.
 
だから、matchを使って検索することもできます.もちろん効率は低いです.
 
GET index/type/_search
{
  "query": {
    "filtered": {
      "filter": {
        "query": {
          "match": {
            "name": {
              "query": "     ",
              "operator": "and"//   or              and
            }
          }
        }
      }
    }
  }
}
もちろん一番簡単な検索方法があります.
GET index/type/_search?size=1
{
  "query": {
    "match": {
      "name": {
        "query": "     "
        , "operator": "or"
      }
    }
  }
}
 
ここではsizeを1に指定していますが、効率を上げるためには設定しなくてもいいです.デフォルトは10です.