DSL Query基本语法
查询的基本语法如下:
GET /indexName/_search
{"query":{"查询类型":{"查询条件":"条件值"}}
}
查询所有
GET /indexName/_search
{"query":{"match_all":{}}
}
match查询
:全文检索查询的一种,会对用户输入内容分词,然后去倒排索引库检索,语法:
GET /indexName/_search
{"query":{"match":{"FIELD":"TEXT"}}
}
GET /hotel/_search
{"query": {"match": {"all": "上海"}}
}
multi_match
:与match查询类似,只不过允许同时查询多个字段,语法:
GET /indexName/_search
{"query":{"multi_match":{"query":"TEXT","fields":["FIELD1","FIELD12"]}}
}
GET /hotel/_search
{"query": {"multi_match": {"query": "外摊如家","fields": ["brand","name","business"]}}
}
在brand、name、business中包括【外滩、如家、外滩如家】的都会被查询到
精确查询
精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。常见的有:
- term:根据词条精确值查询
- range:根据值的范围查询
term查询
GET /indexName/_search
{"query":{"term":{"FIELD":{"value":"VALUE"}}}
}
GET /hotel/_search
{"query": {"term": {"city": {"value": "上海"}}}
}
range查询
GET /indexName/_search
{"query":{"range":{"FIELD":{"gte":10,"lte":20}}}
}
查询价格大于等于100,小于等于150的酒店
GET /hotel/_search
{"query": {"range": {"price": {"gte": 100,"lte": 150}}}
}
地理查询
根据经纬度查询。常见的常见常见包括:
- 搜索最近的酒店
- 搜索最近的出租车
- 搜索附近的人
geo_bounding_box
:查询geo_point
值落在某个矩形范围的所有文档
GET /indexName/_search
{"query":{"geo_bounding_box":{"FIELD":{"top_left":{"lat":31.1,"lon":121.5},"bottom_right":{"lat":30.9,"lon":121.7}}}}
}
通过top_left
和bottom_right
来标注两个点。一个左上,一个右下,然后根据这两个点画一个矩形,所有在这个矩形范围内的坐标都会被搜索出来。
geo_distance
:查询到指定中心点小于某个距离值的所有文档
GET /hotel/_search
{"query": {"geo_distance": {"distance": "15km","location": "31.21, 121.5"}}
}
复合查询
复合(compound)查询:复合查询可以将其它简单查询组合起来,实现更加复杂的搜索逻辑
- function score:算分函数查询,可以控制文档相关性算法,控制文档排名,例如百度竞价。
function score query可以修改文档的相关性算法,根据新得到的算分排序。
给如家这个品牌的酒店排名靠前一些要怎么做?
- 哪些文档需要算分加权?
品牌brand为如家的酒店
- 算分函数是什么?
weight就可以
- 加权模式是什么?
求和
GET /hotel/_search
{"query": {"function_score": {"query": {"match": {"all": "外滩"}},"functions": [{"filter": {"term": {"brand": "如家"}},"weight": 5}],"boost_mode": "sum"}}
}
Boolean Query
布尔查询是一个或多个查询子句的组合。子查询的组合方式有:
- must:必须匹配每个子查询,类似 ”与“
- should:选择性匹配子查询,类似 “或”
- must_not:必须不匹配,不参与算分,类似 “非“
- filter:必须匹配,不参与算分
GET /hotel/_search
{"query": {"bool": {"must": [{"match": {"name": "如家"}}],"must_not": [{"range": {"price": {"gt": 400}}}],"filter": [{"geo_distance": {"distance": "10km","location": {"lat": 31.21,"lon": 121.5}}}]}}
}