美文网首页程序员
搜索引擎ElasticSearch之(6)、搜索详解

搜索引擎ElasticSearch之(6)、搜索详解

作者: 桥头放牛娃 | 来源:发表于2020-05-11 08:21 被阅读0次

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

相关文章

网友评论

    本文标题:搜索引擎ElasticSearch之(6)、搜索详解

    本文链接:https://www.haomeiwen.com/subject/jxegghtx.html