• elasticsearch DSL查询


    总结一个DSL的用法吧,语法网上查去,只记录一点心得,也是研究了半天,太麻烦了

    先附上python代码

    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    from elasticsearch import Elasticsearch
    
    es = Elasticsearch([{'host':'localhost','port':9200}])
    index = 'kuaidi'
    # 精确匹配
    query = {
       "query": {
           "term": {"iinsertTime": "2017-11-26"}
       }
    }
    
    resp = es.search(index, body=query)
    resp_docs = resp['hits']['hits']
    for item in resp_docs:
        print(item['_source']['content'])
    

      

    第一个语法:

      term过滤:term主要用于精确匹配,如字符串、数值、日期等(不适合情况:1.列中除英文字符外有其它值 2.字符串值中有冒号或中文 3.系统自带属性如_version)

    {
    "_index": "kuaidi", 
    "_type": "shang12",
    "_id": "11",
    "_version": 1, //不可用于DSL中的查询条件
    "_score": 1,  //不可用于DSL中的查询条件
    "_source": {  //不可用于DSL中的查询条件
    "title": "韵达快递来了", //值中有中文,不可用于查询
    "insertTime": "2017-11-26 11:12:00", //值中有冒号,不可用于查询
    "insertTime1": "2017-11-2611:12:00", //列中有数字,不可用于查询
    "insertTime2": "2017-11-2611120000",
    "iinsertTime": "2017-11-26",   //可以用于查询
    "age": 69,  //可以用于查询
    "date": "2014-10-03",  //可以用于查询
    "address": "中国经济网1", //值中有中文,不可用于查询
    "address1": "zhonguojinjiwang",  //可以用于查询
    "content": "南都讯 记者王刚 七旬老太在人行道上行走时,突然被一辆正在倒车的顺丰快递车撞倒,交警认定快递车负全部责任。老太家属称,在送往医院后,老太被初步诊断为右侧肩胛骨骨折且嘴唇有破裂的迹象,目前已经出院,但不确定是否会产生后遗症等情况。顺丰回应称,已支付老太所有医药费,后续将进一步与家属进行协商"
    }
    }
    

      

     第二个语法:

      terms:跟term有点类似,但可以同时指定多个条件,相当于union all的作用,汇聚所有查询的值

     {
       "query": {
           "term": {"date": ["2014-09-01","2014-10-03"]}
       }
    }
    
    date为2014-09-01和2014-10-03的值都会被查找出来
    

      第三个语法:

      range:范围查询

    {
       "query": {
           "range":{
               "age":{   //查询age字段
                   "gte":60, //大于60
                   "lt":70 //小于70
               }
           }
       }
    }
    

      第四个语法:

      exists: 此索引中包含指定字段的所有数据(即此字段值不为空)

          missing:此索引中不包含指定字段的所有数据(即此字段的值为空)

    {
       "query": {
           "missing":{
               "field":"age"  // age字段为空的所有数据
           }
       }
    }
    

      第五个语法:

      bool过滤:用来合并多个过滤条件的查询结果的布尔逻辑,必须包含must和should中的一个或多个。它包含以下一些操作

        must: 相当于and

        must_not: 相当于 not

        should: 相当于or(连接多个匹配条件,列表形式)

    {
       "query": {
           "bool":{
               "must":{   //and age==50
                   "term":{"age":50}  
               },
               "must_not":{    //not date=2014-09-01
                   "term":{"date": "2014-09-01"}  
               },
               "should":[  //  _id==8 or _id=9  (举的不太恰当)
                   {"term":{"_id":8}},
                   {"term":{"_id":19}}
               ]
           }
       }
    }
    

      第六个语法:

      match: 一个标准的查询,它可以精确或模糊查询

     {
       "query": {
           "match":{
               "title":"起火 快递"  // title中包含起火 或快递
           }
       }
    }
    

      另一个变种

      multi_match: 同时对多个字段,多个关键字查询

    {
       "query": {
           "multi_match":{
               "query":"老人 起火",  // 查询关键字,多个关键字之间是或的关系
               "fields":['title','address']  // title或address字段中有老人或起火字段
           }
       }
    }
    

      第七个语法:

      正则:regexp

    {
       "query": {
           "regexp":{
               "title":".+[0-9]*.+"  //匹配 任意字符 任意数字 任意字符
           }
       }
    }
    

      第八个语法:

      以什么开关:prefix

    {
       "query": {
           "prefix":{
               "_id":1  // _id 以1开头的数据,不适合值为中文
           }
       }
    }
    

      第九个语法:

      短语匹配:phrase_match ,寻找邻近的几个单词,我理解为精确短语匹配,即查找的短语不会被分词查找

    {
       "query": {
           "match_phrase":{
               "content":"china reference"  // content中包含china reference而不是chian 或 reference
           }
       }
    }
    

      十、列举几个查询的例子

     {
        "query": {
           "match":{"content":"起火"}, # content 有起火
            "match":{"title":"快递"},  # 并且 title 有快递
            "match":{"author":"kongzhagen"}  # 并且 author 为kongzhagen
        }}
    	
    	
    
    {
        "query": {
           "multi_match":{
               "query":"快递"
               ,"fields":["title", "content"]  # title 或 content 中有快递
           }
        }}
    	
    	
    {
        "query": {
           "bool":{
               "must":{
                   "match":{"content":"快递"},  # content 中包含快递的所有数据
               },"filter":{
                    "multi_match":{
                       "query":"顺丰 百世 EMS",  # 结果中查找 content 包含 顺丰 或 百世 或 EMS 的所有数据
                       "fields":["content"]
                   }
               }
           }
        }
    }
    

      

  • 相关阅读:
    正则表达式
    python 模块和包
    python面向对象 : 反射和内置方法
    python面向对象 : 属性, 类方法, 静态方法
    python面向对象 : 抽象类(接口类),多态,封装(私有制封装)
    python面向对象 : 继承
    python面向对象:类空间,对象空间, 组合
    python: 面向对象:类和对象调用类中的变量和方法
    lamda匿名函数(与sorted(),filter(),map() 一起用), 递归函数, 二分查找
    python的各种库的用法
  • 原文地址:https://www.cnblogs.com/kongzhagen/p/7899346.html
Copyright © 2020-2023  润新知