ElasticSearche 高性能query和filter查询语句探索

原文链接: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
          }
        }
      ]
    }
  }
}

 这两种都利用的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 

猜你喜欢

转载自mzhou.iteye.com/blog/2085367