Elasticsearch DSL入门
目录
DSL结构
-
bool模块
-
一下3者可以同时存在,结果集沉淀的方式继续匹配,如果只需要其中一个模块则可以省略外包bool的写法
-
must:必然的,匹配的
-
must_not:不是必然的,不匹配的
-
should:有可能,或者
-
-
from:分页数据第几页
-
size:每页显示的数据总数,默认为10
-
sort:排序模块
POST http://192.168.213.158:9200/index_car/_search
{
"query": {
"bool": {
"must": [
{
"match_all": { }
}
],
"must_not": [ ],
"should": [ ]
}
},
"from": 0,
"size": 10,
"sort": [ ]
}
准备数据
简单查询
- 查询desc属性中包含比亚迪或者2.0T的车
- match模块允许将条件拆分,对条件“比亚迪”和“2.0T”也会进行拆分,所以会查出很多数据
- 下面两种方法对于desc条件都是键值对对象,单一属性默认为“query”,多属性需要罗列出来,如果把第2个方法中的“operator”属性换成“or”,则两者表达的意思完全一样
POST http://192.168.213.158:9200/index_car/_search
{
"query": {
"match": {
"desc": "比亚迪 2.0T"
}
}
}
----------------------------------------------------------------------------
{
"query": {
"match": {
"desc": {
"query":"比亚迪 2.0T",
"operator":"and"
}
}
}
}
- 查询属性在索引中是否存在,存在会返回结果集,否则空结果集
POST http://192.168.213.158:9200/index_car/_search
{
"query": {
"exists": {
"field": "cc"
}
}
}
- term模块,要将条件看作是一个整体,不允许拆分
POST http://192.168.213.158:9200/index_car/_search
{
"query": {
"term": {
"desc": "凯迪拉克"
}
}
}
分页查询
- 分页查询,每页显示3条数据,分页2+1页
POS http://192.168.213.158:9200/index_car/_search
{
"query": {
"match": {
"desc": "比亚迪 2.0T"
}
},
"from":2,
"size":3
}
条件顺序匹配查询
- desc属性中必须同时包含“凯迪拉克”和“2.0T”,而且是按顺序满足,中间非匹配字段最大允许跳过10个
POST http://192.168.213.158:9200/index_car/_search
{
"query": {
"match_phrase": {
"desc": {
"query":"凯迪拉克 2.0T",
"slop":10
}
}
}
}
多属性查询
- “multi_match”多重匹配,在“fields”属性中指定参加匹配的属性
- 第2个方法中用到了“^”,表示提升desc属性的打分,会改变结果集中desc命中后的分值
POST http://192.168.213.158:9200/index_car/_search
{
"query": {
"multi_match": {
"query": "大众",
"fields":["name","desc"]
}
}
}
-----------------------------------------------------------------
{
"query": {
"multi_match": {
"query": "大众",
"fields":["name","desc^20"]
}
}
}
布尔查询
- bool模块中条件
- must匹配
- “name”和“desc”属性中包含“大众”,条件“大众”允许拆分
- “name”属性中必须包含“奥迪”,条件“奥迪”作为一个整体,不允许拆分
- must_not不匹配(与must平级属性)
- “name”属性中包含“奔驰”,条件“奔驰”作为一个整体,不允许拆分
- 结合“must_not”,解释为“name”属性中不允许包含“奔驰”,条件“奔驰”作为一个整体,不允许拆分
- must匹配
POST http://192.168.213.158:9200/index_car/_search
{
"query": {
"bool": {
"must":[
{
"multi_match":{
"query":"大众",
"fields":["name","desc^10"]
}
},
{
"term":{
"name":"奥迪"
}
}
],
"must_not":[{
"term":{
"name":"奔驰"
}
}]
}
}
}
加权查询
- 下面有两种加权方式,增加打分的结果都是一样的
- “fields”属性中“^”加权
- 属性模块中“boost”加权
POST http://192.168.213.158:9200/index_car/_search
{
"query": {
"bool": {
"should":[
{
"multi_match":{
"query":"大众",
"fields":["name","desc^10"]
}
},
{
"match":{
"name":{
"query":"奥迪",
"boost":20
}
}
}
]
}
}
}
过滤器
- “post_filter”与“query”是平级模块
- “range”范围过滤,“num”属性大于等于200且小于等于123456
POST http://192.168.213.158:9200/index_car/_search
{
"query": {
"match":{
"desc":"大众"
}
},
"post_filter":{
"range":{
"num":{
"gte":200,
"lte":123456
}
}
}
}
排序
- “sort”与“query”平级模块
- 主要根据“num”属性升序排列
- 次要条件,当“num”部分数据无法完成排序,根据“price”倒序排列
POST http://192.168.213.158:9200/index_car/_search
{
"query": {
"match":{
"desc":"比亚迪"
}
},
"post_filter":{
"range":{
"num":{
"gte":200,
"lte":123456
}
}
},
"sort":[
{
"num":"asc"
},
{
"price":"desc"
}
]
}
高亮查询
- “highlight”与“query”平级模块
- “pre_tags”与“post_tags”定义关键字的标签,默认为“<em></em>”标签
- 注意“fields”定义的属性要与“query”定义的属性保持一致,否则结果无法被标记为高亮
POST http://192.168.213.158:9200/index_car/_search
{
"query": {
"multi_match":{
"query":"比亚迪",
"fields":["name","desc"]
}
},
"highlight":{
"pre_tags": ["<span>"],
"post_tags": ["</span>"],
"fields":[
{
"desc":{}
},
{
"name":{}
}
]
}
}
模糊匹配
- 纠错查询
- 第一个查询为自动纠错,更倾向于第一个
- 第二个查询为纠错位数,对中文不是很友好
POST http://192.168.213.158:9200/index_car/_search
{
"query": {
"fuzzy":{
"desc":"比亚滴"
}
}
}
---------------------------------------------------------
{
"query": {
"multi_match":{
"query":"比亚滴",
"fields":["name","desc"],
"fuzziness":"1"
}
}
}
- 前缀查询
POST http://192.168.213.158:9200/index_car/_search
{
"query": {
"prefix":{
"desc":"比"
}
}
}
-
通配符查询,对中文不是很友好
- “?”表示1个不确定因素
- “*”表示1个或者多个不确定因素
POST http://192.168.213.158:9200/index_car/_search
{
"query": {
"wildcard":{
"desc":"*an"
}
}
}
-----------------------------------------------------------------
{
"query": {
"wildcard":{
"desc":"d?g"
}
}
}
定义返回属性
{
"query": {
"match":{
"name":"长安"
}
},
"_source":["id","desc"]
}