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

  

原文地址:https://www.cnblogs.com/kongzhagen/p/7899346.html