1、查询参数
1.1、分页查询
分页查询需指定两个参数。
from:指定起始偏移量,默认为0;
size:指定查询结果包含的文档数。
示例:
GET /city/_doc/_search
{
"from":0,
"size":2
}
1.2、返回版本号
当查询结果需要返回文档版本号时,需在查询顶层添加version字段,并设其值为true;
示例:
GET /city/_doc/_search
{
"version":true
}
1.3、返回指定字段
当查询只需返回文档的部分字段时,可在请求的主体部分添加_source数组,表示只返回指定的字段。
示例:
GET /city/_doc/_search
{
"_source":["c*","name"]
}
1.4、选择搜索类型
用户可以选择合适的搜索执行方式,在请求中使用search_type参数可指定。
- query_then_fetch(默认):查询语句先得到将文档排序所需的信息,然后得到要获取的文档内容的分片。
- dfs_query_then_fetch(默认):同query_then_fetch类似,还执行初始查询阶段,该阶段计算分布式的词频以更精准的对返回文档打分。
2、基本查询
2.1、term查询
term查询为精确匹配查询,其仅匹配在给定字段有某个对应词项的文档,查询提供的词条不会被分析器进行分析。
示例:
GET /city/_doc/_search
{
"query":{
"term":{"describe":"中国"}
}
}
2.2、terms查询
terms是term查询的加强,其允许匹配包含多个词项的文档。
示例:
GET /city/_doc/_search
{
"query":{
"terms":{"describe":["河北","省会"]},
"minimum_match":2
}
}
2.3、match查询
match查询会提取查询参数中给定的取值,分析这些值,并基于分析结果构造合适的查询。match查询会根据对应的字段选择合适的分析器,默认选择索引时使用的分析器。
示例:
GET /city/_doc/_search
{
"query":{
"match":{
"describe":"中国省会"
}
}
}
2.4、multi_match查询
multi_match查询与match查询类似,前者同时查询多个字段。
示例:
GET /city/_doc/_search
{
"query":{
"multi_match":{
"query":"中国",
"fields":["country","describe"]
}
}
}
2.5、query_string查询
query_string支持所有lucene的查询语法。
示例:
GET /city/_doc/_search
{
"query":{
"query_string":{
"query":"中国",
"fields":["country","describe"]
}
}
}
2.6、ids查询
ids查询是通过指定的多个返回对应的文档,这类查询作用在_uid字段。
示例:
GET /city/_doc/_search
{
"query":{
"ids":{
"values":["1","2"]
}
}
}
2.7、prefix查询
prefix可以查找某个字段以指定前缀开始的文档。
示例:
GET /city/_doc/_search
{
"query":{
"prefix":{
"country":"中"
}
}
}
2.8、fuzzy查询
fuzzy为模糊查询,通过计算给定词项与文档的编辑距离来得到结果,此类查询对CPU资源消耗较高,但对需要模糊匹配的场景比较有用。
示例:
GET /city/_doc/_search
{
"query":{
"fuzzy":{
"describe":"中国"
}
}
}
2.9、match_all查询
match_all查询是一种匹配索引中所有文档的简单查询。
示例:
GET /city/_doc/_search
{
"query":{
"match_all":{}
}
}
2.10、wildcard查询
wildcard查询允许我们在查询内容时使用通配符 * 和?。
示例:
GET /city/_doc/_search
{
"query":{
"wildcard":{
"country":"中*"
}
}
}
2.11、range查询
range查询允许按照范围在某个数值型或字符串型字段上查找文档。range查询只作用在单个字段上,并且查询的参数封装在字段的名称中。
range查询支持一下参数:
- gte:范围大于或等于此参数的文档;
- gt:范围大于此参数的文档;
- lte:范围小于或等于此参数的文档;
- lt:范围小于此参数的文档;
示例:
GET /city/_doc/_search
{
"query":{
"range":{
"population":{"gte":"0","lte":"1000"}
}
}
}
2.12、regexp查询
regexp查询即为正则查询,可以使用正则表达式来查询文本,此类查询性能取决于所选择的正则表达式,如果正则表达式匹配的词条较多,则性能很慢。
示例:
GET /city/_doc/_search
{
"query":{
"regexp":{
"name":{"value":"北.*"}
}
}
}
3、复合查询
3.1、bool查询
bool查询可以与其他查询封装一起使用,并可和选项进行复杂逻辑连接。
- should:封装在此选项下的查询可以匹配也可以不匹配;
- must:封装在此选项下的查询必选匹配;
- must_not:封装此选项下的查询必须不匹配;
每个选项可以出现多次,而文档分值为匹配的封装的查询分值的总和。
示例:
GET /city/_doc/_search
{
"query":{
"bool":{
"should":{"term":{"country":"中国"}},
"must":{"range":{"population":{"gte":1000,"lt":5000}}},
"boost":10
}
}
}
3.2、boosting查询
boosting查询会封装两个查询,并将一个查询的分值保持不变而降低另一个分值,此查询的两个查询结果都会在最终结果中出现。
此查询主要有三个部分:
- positive查询:此查询返回的分值不变;
- negative查询:此查询返回的分值会被降低;
- negative_boost:用于降低negative查询的权重值;
示例:
GET /city/_doc/_search
{
"query":{
"boosting":{
"positive":{"term":{"country":"中国"}},
"negative":{"range":{"population":{"gte":1000,"lt":5000}}},
"negative_boost":0.2
}
}
}
3.3、constant_score查询
此查询用于封装另一个查询,被封装查询返回的每个文档都得到设定的分值,此查询允许严格控制被查询或被过滤的匹配文档的分值。
示例:
GET /city/_doc/_search
{
"query":{
"constant_score":{
"filter":{
"range":{"population":{"gte":1000,"lt":5000}}
},
"boost":2
}
}
}
3.4、dis_max查询
dis_max查询即分离最大化查询(Disjunction Max Query),是指返回所有与任一查询匹配的文档,但文档评分为最佳匹配的评分。即best_field策略,某一个field中匹配到了尽可能多的关键词,被排在前面。
示例:
GET /city/_doc/_search
{
"query":{
"dis_max":{
"queries":[
{"match":{"country":"中国"}},
{"match":{"describe":"中国"}}
]
}
}
}
4.4、function_score查询
function_score允许为每个与主查询匹配的文档应用一个函数,以达到改变甚至完全替换原始查询评分 _score 的目的。
预定义函数:
- weight:为每个文档应用一个权重提升值,当weight为N时,最终结果为N * _score;
- field_value_factor:使用这个值来修改_score,将某些字段作为考虑因素;
- random_score:为每个用户都使用一个不同的随机评分对结果排序,但对同一用户来说,看到的顺序始终一致;
- 衰减函数(linear,exp,gauss):将浮动值结合到评分_score中,如发布时间、地理位置,某个特定价格等。
- script_score:使用自定义脚本完全控制评分计算;
简单示例:
GET /city/_doc/_search
{
"query":{
"function_score":{
"query":{
"multi_match":{
"query":"中国",
"fields": [ "country", "describe" ]
}
}
}
}
}
多函数示例:
GET /city/_doc/_search
{
"query":{
"function_score":{
"query":{
"match":{"country":"中国"}
},
"functions":[
{
"filter":{"range":{"population":{"gt":1000}}},
"weight":5
},
{
"filter":{"match":{"describe":"中国"}},
"weight":1
}
],
"score_mode": "sum"
}
}
}
score_mode评分模式:
- multiply:函数结果求积(默认)。
- sum:函数结果求和。
- avg:函数结果的平均值。
- max:函数结果的最大值。
- min:函数结果的最小值。
- first:使用首个函数(可以有过滤器,也可能没有)的结果作为最终结果
随机评分示例:
GET /city/_doc/_search
{
"query":{
"function_score":{
"query":{
"match":{"country":"中国"}
},
"functions":[
{
"filter":{"range":{"population":{"gt":1000}}},
"weight":5
},
{
"filter":{"match":{"describe":"中国"}},
"weight":1
},
{
"random_score":{
"seed":"11223344"
}
}
],
"score_mode": "sum"
}
}
}
基于范围权重:
GET /city/_doc/_search
{
"query":{
"function_score":{
"query":{
"match":{"country":"中国"}
},
"functions":[
{
"gauss":{"population":{"origin":1000,"offset":1000,"scale":100}},
"weight":10
}
],
"score_mode": "sum"
}
}
}
4、地理位置查询
4.1、geo_bounding_box过滤器
geo_bounding_box过滤在指定距离中的点。
示例:
GET /city/_doc/_search
{
"query": {
"bool": {
"must":
{ "match_all": { }},
"filter":
{
"geo_bounding_box":{
"location":{
"top_left":{
"lat":40.1111,
"lon":116.23027
},
"bottom_right":{
"lat":39.777352,
"lon":116.591448
}
}
}
}
}
}
}
4.2、geo_distance过滤器
geo_distance为地理距离过滤器,以给定位置为圆心画一个圆,找出地理坐标落在其中的文档。
示例:
GET /city/_doc/_search
{
"query": {
"bool": {
"must":
{ "match_all": { }},
"filter":
{
"geo_distance":{
"location":{
"lat":40.1111,
"lon":116.23027
},
"distance_type": "plane",
"distance":"100km"
}
}
}
}
}
distance_type为两点间距离计算的算法:
- arc:最慢但最精确的计算方式,此方式将世界当球体来处理,精度有限。
- plane:此方式将地球当做平坦的来计算,速度快一些但精度略差,赤道附近精度最好,两极精度最差;
- sloppy_arc:是一种精度换取速度的计算方式,比arc计算方式块4-5倍,且距离精度达到99.9%,也是默认的计算方式。
4.3、按经纬度距离排序
可以按远近距离进行排序。
使用示例:
GET /city/_doc/_search
{
"query": {
"bool": {
"must":
{ "match_all": { }},
"filter":
{
"geo_bounding_box":{
"location":{
"top_left":{
"lat":40.1111,
"lon":116.23027
},
"bottom_right":{
"lat":39.777352,
"lon":116.591448
}
}
}
}
}
},
"sort": [
{
"_geo_distance": {
"location": {
"lat": 39.916527,
"lon": 116.397128
},
"order": "asc",
"unit": "km",
"distance_type": "plane"
}
}
]
}
网友评论