程序员

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

2020-05-11  本文已影响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参数可指定。

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查询支持一下参数:

示例:

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查询可以与其他查询封装一起使用,并可和选项进行复杂逻辑连接。

GET /city/_doc/_search
{
  "query":{
    "bool":{
      "should":{"term":{"country":"中国"}},
      "must":{"range":{"population":{"gte":1000,"lt":5000}}},
      "boost":10
    }
  }
}

3.2、boosting查询

boosting查询会封装两个查询,并将一个查询的分值保持不变而降低另一个分值,此查询的两个查询结果都会在最终结果中出现。
此查询主要有三个部分:

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 的目的。
预定义函数:

简单示例:

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评分模式:

随机评分示例:

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为两点间距离计算的算法:

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" 
      }
    }
  ]
}
上一篇 下一篇

猜你喜欢

热点阅读