SpringCloud(七.4)ES(elasticsearch)-- DSL查询语法
DSL查询语法
1、查询所有
以下是简写和全写
总结:
2、全文检索查询(match)
全文检索查询,会对用户输入内容分词,常用于搜索框搜索:
回顾在 SpringCloud(七.3)ES(elasticsearch)-- RestClient操作 中创建索引时添加的 all 字段,以及字段拷贝 copy_to。这里all字段就派上了用场。
match查询
match查询:全文检索查询的一种,会对用户输入的内容分词,然后去倒排索引库检索,语法如下:
#match查询 GET /hotel/_search { "query": { "match": { "字段名": "检索内容" } } }
示例: 这样ES会根据字段拷贝copy_to 的三个字段(名称、品牌、城市)中去检索“外滩”,并返回数据。
#match查询 GET /hotel/_search { "query": { "match": { "all": "外滩" } } }
结果如图:
multi_match查询(多字段查询)
multi_match查询,与match查询类似,只不过允许同时查询多个字段,但是要注意!查询的字段越多,性能越差,推荐使用match查询。
语法如下:
#multi_match查询 GET /hotel/_search { "query": { "multi_match": { "query": "要检索的内容", "fields": ["字段1","字段2","字段3"] } } }
示例:在名称、品牌、商圈三个字段中检索“外滩”。
#multi_match查询 GET /hotel/_search { "query": { "multi_match": { "query": "要检索的内容", "fields": ["name","brand","business"] } } }
结果如图:
3、精确查询
精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。常见的有
- term:根据词条精确值查询。(如:品牌、城市、酒店星级等等)
- range:根据值的范围查询。(如:价格、日期等等)
term语法如下:
#term查询 GET /hotel/_search { "query": { "term": { "字段名": { "value": "查询内容" } } } }
示例:查询 城市 在 上海 的酒店数据
#term查询 GET /hotel/_search { "query": { "term": { "city": { "value": "上海" } } } }
结果如图:
range语法如下:
gt -- 大于 gte -- 大于等于 lt -- 小于 lte -- 小于等于
#range查询 GET /hotel/_search { "query": { "range": { "字段名": { "gte": 大于等于值, "lte": 小于等于值 } } } }
示例:查询 价格 在 200-300 元区间的酒店信息
#range查询 GET /hotel/_search { "query": { "range": { "price": { "gte": 200, "lte": 300 } } } }
结果如图:
4、地理查询
示例:
#distance查询 GET /hotel/_search { "query": { "geo_distance":{ "distance":"2km", "location":"31.21,121.5" } } }
5、复合查询
复合(compound)查询:复合查询可以将其它简单查询组俣起来,实现更复杂的搜索逻辑,例如:
1)function score (BM25算法)
算分函数查询,可以控制文档相关性算分,控制文档排名。例如百度竞价。
all 字段拷贝copy_to 的三个字段(名称、品牌、城市)中去检索含有“外滩”字样的酒店数据。
#match查询 GET /hotel/_search { "query": { "match": { "all": "外滩" } } }
加function score查询
#function score查询 GET /hotel/_search { "query": { "function_score": { "query": { "match": { "all": "外滩" } }, "functions": [ { "filter": { "term": { "brand": "如家" } }, "weight": 2 } ], "boost_mode": "sum" } } }
效果对比展示:
match查询结果显示顺序如下:
function score查询结果显示顺序如下:可以看出影响了默认source评分,如家评分加了2显示在了第一位!
将weight改为10,让效果更为突显一点,如下:
2)Boolean Query
如图:搜索框的内容放到must 参与算分,下面的过滤条件 品牌、条件 可以放到 must_not 或 filter 中 不参数算分。提高性能。
注意事项:must_not 是必须不匹配,所以这里用的是 gt (大于)
gt -- 大于 gte -- 大于等于 lt -- 小于 lte -- 小于等于
#bool查询 GET /hotel/_search { "query": { "bool": { "must": [ {"term": { "name": { "value": "如家" } }} ], "must_not": [ {"range": { "price": { "gt": 400 } }} ], "filter": [ { "geo_distance": { "distance": "10km", "location": { "lat": 31.21, "lon": 121.5 } } } ] } } }
效果展示:
多字段filter写法