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"
    }
  }
}'

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于使用Redis存储token的情况,你可以按照以下步骤进行操作: 1. 安装Redis:首先,确保你已经在服务器上安装了Redis数据库。你可以从官方网站(https://redis.io/)上获取适合你操作系统的安装包,并按照说明进行安装。 2. 连接Redis:在你的应用程序中,使用适合你编程语言的Redis客户端库与Redis建立连接。常用的编程语言有Python、Java、Node.js等,每种语言都有对应的Redis客户端库。 3. 生成和存储token:在用户登录验证成功后,生成一个唯一的token,并将其存储到Redis中。你可以使用用户的唯一标识符(如用户ID)作为key,将token作为value存储。例如,使用Python语言和`redis-py`库可以这样实现: ```python import redis import secrets redis_host = 'localhost' redis_port = 6379 redis_db = 0 # 连接Redis r = redis.Redis(host=redis_host, port=redis_port, db=redis_db) # 生成token token = secrets.token_hex(16) # 使用secrets库生成随机token # 存储token到Redis user_id = 'user123' # 假设用户的唯一标识符是'user123' r.set(user_id, token) ``` 4. 验证token:当需要验证用户请求中的token时,从Redis中获取存储的token,并与请求中的token进行比较。如果两者一致,则验证通过。例如,使用Python语言和`redis-py`库可以这样实现: ```python import redis redis_host = 'localhost' redis_port = 6379 redis_db = 0 # 连接Redis r = redis.Redis(host=redis_host, port=redis_port, db=redis_db) # 获取存储的token user_id = 'user123' # 假设用户的唯一标识符是'user123' stored_token = r.get(user_id) # 验证token request_token = '...' # 从请求中获取的token if stored_token and stored_token.decode() == request_token: # 验证通过 pass else: # 验证失败 pass ``` 这只是一个简单的示例,你可以根据具体需求进行适当修改和完善。记得在合适的时机清除过期的token,以避免Redis数据库占用过多内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值