elasticsearch的dsl查询

     测试es的dsl查询,准备数据,在插入数据的时候,如果index、type、mapping都没有,es会自动创建

一、数据的准备

curl -XPOST "http://192.168.99.1:9200/new_index/product/p1" -d'
{
  "name":"new Mac Book"
}'

curl -XPOST "http://192.168.99.1:9200/new_index/product/p2" -d'
{
  "name":"note book",
  "price":12345,
  "cats":["notes"]
}'

curl -XPOST "http://192.168.99.1:9200/new_index/product/p3" -d'
{
  "name":"apples",
  "price":4,
  "cats":["fruit"]
}'

curl -XPOST "http://192.168.99.1:9200/new_index/product/p4" -d'
{
  "name":"pen",
  "price":50
}'

curl -XPOST "http://192.168.99.1:9200/new_index/product/p5?routing=p5" -d'
{
  "name":"add document use routing"
}'

curl -XPOST "http://192.168.99.1:9200/new_index/product/p6" -d'
{
  "name":"I love apples too.",
  "price":60
}'

二、修改name字段的mapping

       注意:1、mapping是要在创建索引的时候创建好,已经创建好的field的mapping不可再次修改,但是可以新增field的mapping

                  2、在es5中,需要设置text类型字段的fielddata=true,不然下方的查询会报错

curl -XPOST "http://192.168.99.1:9200/new_index/_mapping/product" -d'
{
  "properties": {
    "name":{
      "type": "text", 
      "fielddata": true
    }
  }
}'

三、查询出price在1-200之间,且name属性中必须不包含pen,按照price降序,name升序,对返回的结果进行分页,_source中的数据进行过滤,返回name字段分词后的term数据

        注意:已经分词过的字段不建议排序,耗性能,而且排序也不一定能得到想要的结果
    

curl -XGET "http://192.168.99.1:9200/new_index/product/_search" -d'
{
  "explain": true, 
  "from": 0,
  "size": 20, 
  "fielddata_fields" : ["name"],
  "_source": {
    "include": ["name*","price"],
    "exclude": ["name"]
  },
  "version": true, 
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "price": {
              "gte": 1,
              "lte": 200
            }
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "name": {
              "value": "pen"
            }
          }
        }
      ]
    }
  },
  "sort": [
    {
      "price": "desc"
    },
    {
      "name" : {
        "order": "asc"
      }
    }
  ]
}'

 四、统计price在1-200之间,且name属性中必须不包含pen的数据的数量

curl -XGET "http://192.168.99.1:9200/new_index/product/_count" -d'
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "price": {
              "gte": 1,
              "lte": 200
            }
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "name": {
              "value": "pen"
            }
          }
        }
      ]
    }
  }
}'

 五、查询price在1-200之间,且name属性中必须不包含pen的数据是否存在

curl -XGET "http://192.168.99.1:9200/new_index/product/_search" -d'
{
  "size":0,
  "terminate_after":1,
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "price": {
              "gte": 1,
              "lte": 200
            }
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "name": {
              "value": "pen"
            }
          }
        }
      ]
    }
  }
}'

 六、查询id为p1,p3,p4的数据

 

curl -XGET "http://192.168.99.1:9200/new_index/product/_search" -d'
{
  "query": {
    "ids": {
      "values": ["p1","p2","p3"]
    }
  }
}'

   如果上方的查询url中没有指定type,那么也是可以在ids下方指定type的

 七、查询文档中一定包含price字段的文档

curl -XGET "http://192.168.99.1:9200/new_index/product/_search" -d'
{
  "query": {
    "exists" : {
      "field" : "price"
    }
  }
}'

 八、通配符查询,查询name字段是bo*k这种格式的

curl -XGET "http://192.168.99.1:9200/new_index/product/_search" -d'
{
  "query": {
    "wildcard": {
      "name": {
        "value": "bo*k"
      }
    }
  }
}'

 九、query和filter一起结合使用

    需求:过滤出price在1-200之间,name中包含apples

    注意:1、query查询需要考虑到文档的相关性评分,而filter不需要。

               2、filter查询的结果会缓存,速度比query要快

               3、一般需要做全文检索的字段或需要考虑到相关度评分的字段使用query查询,其余的可以考虑使用filter过滤。

curl -XGET "http://192.168.99.1:9200/new_index/product/_search" -d'
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "price": {
            "gte": 1,
            "lte": 200
          }
        }
      },
      "must": [
        {
          "term": {
            "name": {
              "value": "apples"
            }
          }
        }
      ]
    }
  }
}'

十、match匹配查询

    operator:

        and :  表示query中的数据分词后的都需要匹配上。

        or    :  表示query中的数据分词后任意一个匹配上即可。(默认)

    minimum_should_match : 里面的值写百分比,即query中的词分词后,满足minimum_should_match这个里面的百分比即可。默认最少需要匹配一个。(如果query中的词可以分成3个term,配置的百分比为80%,那么3*0.8最终需要匹配2个)
  
 十一、multi_match查询,从多个字段中查询

          注意:fields中写的是多个字段

                     type 的值有多个,不同的值会影响文档的得分

curl -XGET "http://192.168.99.1:9200/new_index/product/_search" -d'
{
  "query": {
    "multi_match": {
      "query": "apples",
      "fields": ["name","descs"],
      "type": "best_fields"
    }
  }
}'

 

posted @ 2017-08-16 17:49  huan1993  阅读(66)  评论(0编辑  收藏  举报