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