官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。官方文档地址:
Elasticsearch Clients | Elastic 

Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:
查询所有:查询出所有数据,一般测试用。例如: match_all
全文检索( full text )查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:
match_query
multi_match_query
精确查询:根据精确词条值查找数据,一般是查找 keyword 、数值、日期、 boolean 等类型字段。例如:
ids
range
term
地理( geo )查询:根据经纬度查询。例如:
geo_distance
geo_bounding_box
复合( compound )查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。例如:
bool
function_score
2.全文检索
#查询所有
GET /hotel/_search
{
"query": {
"match_all": {}
}
}#match查询:全文检索查询的一种,会对用户输入内容分词,然后去倒排索引库检索,语法:
GET /hotel/_search
{
"query": {
"match": {
"all": "如家"
}
}
}#multi_match 与match查询类似,只不过允许同时查询多个字段,语法:
GET /hotel/_search
{
"query": {
"multi_match": {
"query": "外滩如家",
"fields": ["brand","name","business"]
}
}
}match和multi_match的区别是什么?
match :根据一个字段查询
multi_match :根据多个字段查询,参与查询字段越多,查询性能越差
3.精确查询
精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。常见的有:
term :根据词条精确值查询
range :根据值的范围查询
精确查询常见的有哪些?
term 查询:根据词条精确匹配,一般搜索 keyword 类型、数值类型、布尔类型、日期类型字段
range 查询:根据数值范围查询,可以是数值、日期的范围
#term 精确查询
GET /hotel/_search
{
"query": {
"term": {
"city": {
"value": "上海"
}
}
}
}#range范围查询
GET /hotel/_search
{
"query": {
"range": {
"price": {
"gte": 20,
"lte": 400
}
}
}
}4.地理查询
根据经纬度查询。常见的使用场景包括:
携程:搜索我附近的酒店
滴滴:搜索我附近的出租车
微信 :搜索我附近的人
根据经纬度查询,官方文档 
geo_bounding_box :查询 geo_point 值落在某个矩形范围的所有文档
// geo_bounding_box查询
GET /indexName/_search
{
"query": {
"geo_bounding_box": {
"FIELD": {
"top_left": {
"lat": 31.1,
"lon": 121.5
},
"bottom_right": {
"lat": 30.9,
"lon": 121.7
}
}
}
}
}
geo_distance :查询到指定中心点小于某个距离值的所有文档
# geo_distance 查询
GET /hotel/_search
{
"query": {
"geo_distance": {
"distance": "2km",
"location": "31.21,121.5"
}
}
}复合查询
复合(compound)查询:复合查询可以将其它简单查询组合起来,实现更复杂的搜索逻辑,例如:
fuction score:算分函数查询,可以控制文档相关性算分,控制文档排名。例如百度竞价
相关性算分
当我们利用match查询时,文档结果会根据与搜索词条的关联度打分(_score),返回结果时按照分值降序排列。
例如,我们搜索 "虹桥如家",结果如下:
[
{
"_score" : 17.850193,
"_source" : {
"name" : "虹桥如家酒店真不错",
}
},
{
"_score" : 12.259849,
"_source" : {
"name" : "外滩如家酒店真不错",
}
},
{
"_score" : 11.91091,
"_source" : {
"name" : "迪士尼如家酒店真不错",
}
}
]

elasticsearch中的相关性打分算法是什么?
TF-IDF :在 elasticsearch5.0 之前,会随着词频增加而越来越大
BM25 :在 elasticsearch5.0 之后,会随着词频增加而增大,但增长曲线会趋于水平
Function Score Query
使用 function score query,可以修改文档的相关性算分(query score),根据新得到的算分排序
GET /hotel/_search
{
"query": {
"function_score": {
#原始查询条件,搜索文档并根据相关性打分(query score)
"query": { "match": {"all": "外滩"} },
"functions": [
{
# 过滤条件,符合条件的文档才会被重新算分
"filter": {"term": {"id": "1"}},
#算分函数,算分函数的结果称为function score,
#将来会与query score运算,得到新算分,常见的算分函数有:
#weight:给一个常量值,作为函数结果(function score)
#field_value_factor:用文档中的某个字段值作为函数结果
#random_score:随机生成一个值,作为函数结果
#script_score:自定义计算公式,公式结果作为函数结果
"weight": 10
}
],
#加权模式,定义function score与query score的运算方式,包括:
#1.multiply:两者相乘。默认就是这个
#2.replace:用function score 替换 query score
#3.其它:sum、avg、max、min
"boost_mode": "multiply"
}
}
}
#function_score查询
GET /hotel/_search
{
"query": {
"function_score": {
"query": {
"match": {
"all": "外滩"
}
},
"functions": [
{
"filter": {
"term": {
"brand": "如家"
}
},
"weight": 10
}
],
"boost_mode": "multiply"
}
}
}function score query定义的三要素是什么?
过滤条件:哪些文档要加分
算分函数:如何计算 function score
加权方式: function score 与 query score 如何运算
复合查询 Boolean Query
布尔查询是一个或多个查询子句的组合。子查询的组合方式有:
must :必须匹配每个子查询,类似“与”
should :选择性匹配子查询,类似“或”
must_not :必须不匹配,不参与算分,类似“非”
filter :必须匹配,不参与算分
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{"term": {"city": "上海" }}
],
"should": [
{"term": {"brand": "皇冠假日" }},
{"term": {"brand": "华美达" }}
],
"must_not": [
{ "range": { "price": { "lte": 500 } }}
],
"filter": [
{ "range": {"score": { "gte": 45 } }}
]
}
}
}搜索名字包含“如家”,价格不高于400,在坐标31.21,121.5周围10km范围内的酒店
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{
"match": {"name": "如家"}
}
],
"must_not": [
{
"range": { "price": {"gt": 400}}
}
],
"filter": [
{
"geo_distance": {
"distance": "10km", "location": {"lat": 31.21, "lon": 121.5}
}
}
]
}
}
}
















