12.7 DSL查询语法
查询的基本语法
GET /indexName/_search
{
"query": {
"查询类型": {
"查询条件": "条件值"
}
}
}
查询所有
GET /hotel/_search
{
"query": {
"match_all": {}
}
}
12.7.1 全文检索查询
全文检索查询,会对用户搜索内容进行分词,常用于搜索框搜索
match查询,全文检索查询的一种,会对用户输入内容进行分词,然后去倒排索引库检索
# match查询
GET /hotel/_search
{
"query": {
"match": {
"all": "外滩如家"
}
}
}
multi_match: 允许同时查询多个字段,查询字段越多,性能越差
# multi_match查询
GET /hotel/_search
{
"query": {
"multi_match": {
"query": "外滩如家",
"fields": ["brand","name","business"]
}
}
}
12.7.2 精确查询
一般是查找keyword 数值,日期,boolean类型,你不会对搜索条件分词
term: 根据词条精确查询
# 精确查询
GET /hotel/_search
{
"query": {
"term": {
"city": {
"value": "上海"
}
}
}
}
range: 根据值的范围查询:
# 范围查询
GET /hotel/_search
{
"query": {
"range": {
"price": {
"gte": 100,
"lte": 300
}
}
}
}
12.7.3 地理查询
geo_bounding_box查询 查询的是给定的两点形成的矩形区域内满足要求的文档
geo_distance 查询的是到指定中心点小于某个距离的文档值
# 地理查询geo_distance
GET /hotel/_search
{
"query": {
"geo_distance": {
"distance": "15km",
"location": "31.21 , 121.5"
}
}
}
12.7.4 复合查询
12.7.4.1 Function Score 查询
function score : 相关性算分查询,控制文档排名
例 : 给如家品牌的酒店排名考前一点
GET /hotel/_search
{
"query": {
"function_score": {
"query": {
"match": {
"all": "外滩"
}
},
"functions": [
{
"filter": {
"term": {
"brand": "如家"
}
},
"weight": 10
}
],
"boost_mode": "sum"
}
}
}
12.7.4.2 Boolean查询
布尔查询是一个或多个查询子句的集合, 子查询的组合方式有:
must : 必须匹配每个子选项 类似"与"
should : 选择性匹配 类似"或"
must_not: 必须不匹配 ,不参与算分 类似"非"
filter: 必须匹配, 不参与算分
例1:查询上海的皇冠假日或华美达酒店并且价格在500以上,并且得分不低于45分
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{"term": {"city": "上海"}}
],
"should": [
{"term": {"brand": "皇冠假日"}},
{"term": {"brand": "华美达"}}
],
"must_not": [
{"range": {"price": {"lte": 500} }}
],
"filter": [
{"range": {"score": {"gte": 45}}}
]
}
}
}
例2: 查询名字包含如家 价格不高于400 坐标在31.21,121.5周围10km的酒店
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"brand": "如家"
}
}
],
"must_not": [
{
"range": {"price": {"gt": 400}}
}
],
"filter": [
{
"geo_distance": {
"distance": "10km",
"location": {"lat": 31.21,"lon": 121.5}
}
}
]
}
}
}
12.7.5 搜索结果处理
12.7.5.1 排序
默认根据先关度算分来排序,可以自定义: keyword类型,数值类型,地理坐标类型,日期类型
普通字段:
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"FIELD": "desc"
}
]
}
地理位置距离排序:
GET /hotel/_search
{
"query":{
"match_all": {}
},
"sort": [
{
"geo_distance": {
"FIELD": "经度,纬度",
"order": "asc",
"unit": "km"
}
}
]
}
例1: 按用户评价排序酒店,评价相同的按价格排序
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"score": "desc"
},
{
"price": "asc"
}
]
}
例2: 实现对酒店数据按自己的位置距离进行升序排序
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"_geo_distance": {
"location": {
"lat": 31.034661,
"lon": 121.612282
},
"order": "asc",
"unit": "km"
}
}
]
}
12.7.5.2 分页
# 分页查询
GET /hotel/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"price": "asc"
}
],
"from": 10, // 从第几条开始
"size": 10 // 每页多少条 from+size不能超过10000
}
12.7.5.3 高亮
# 高亮查询 默认情况下 ES搜索字段必须与高亮字段一致
GET /hotel/_search
{
"query": {
"match": {
"all": "如家"
}
},
"highlight": {
"fields": {
"name": {
"require_field_match": "false", // 取消默认 改为不用与搜索字段一致
"pre_tags": "<em>",
"post_tags": "</em>"
}
}
}
}