总结一个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"] } } } } }