DSL查询分类

简单查询

es官网文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html

1.查询所有:查询出所有数据,一般测试用。例如:match_all

GET /hotel/_search
{
  "query": {
    "match_all": {}
  }
}

2.全文检索查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:

	match_query 根据单字段查询
	multi_match_query 根据多个字段查询,参与查询字段越多,查询性能越差
GET /hotel/_search
{
  "query": {
    "match": {
      "all": "如家外滩"	#这个all字段是之前创建的时候  copy_to all进去的
    }
  }
}

GET /hotel/_search
{
  "query": {
    "multi_match": {
      "query": "如家外滩",
      "fields": ["brand","name","business"]
    }
  }
}


3.精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:

term:根据词条精确值查询
GET /hotel/_search
{
  "query": {
    "term": {
      "city": {
        "value": "上海"
      }
    }
  }
}
range:根据值的范围查询
GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "gt": 1108,
        "lt": 3000
      }
    }
  }
}
4.地理(geo)查询:根据经纬度查询。例如:
	geo_distance
	geo_bounding_box
5.复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。例如:
	bool
	function_score

4.地理查询根据经纬度查询。

查询到指定中心点小于某个距离值的所有文档

GET /hotel/_search
{
  "query": {
    "geo_distance":{
      "distance":"2km",
      "location":"31.21,121.5"		#	你的位置
    }
  }
}

复合查询

elasticsearch中的相关性打分算法是什么?
TF-IDF:在elasticsearch5.0之前,会随着词频增加而越来越大
BM25:在elasticsearch5.0之后,会随着词频增加而增大,但增长曲线会趋于水平

1.使用 function score query,可以修改文档的相关性算分(query score),根据新得到的算分排序。

案例:给“如家”这个品牌的酒店排名靠前一些
把这个问题翻译一下,function score需要的三要素:
1.哪些文档需要算分加权?
品牌为如家的酒店
2.算分函数是什么?
weight就可以
3.加权模式是什么?
求和

# function score查询

GET /hotel/_search
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "all": "外滩"
        }
      },"functions": [
        {
          "filter": {
            "term": {
              "brand": "如家"
            }
          },
          "weight": 10
        }
      ],
    "boost_mode": "sum"
    }
  }
}

2.Boolean Query

布尔查询是一个或多个查询子句的组合。子查询的组合方式有:
must:必须匹配每个子查询,类似“与”
should:选择性匹配子查询,类似“或”
must_not:必须不匹配,不参与算分,类似“非”
filter:必须匹配,不参与算分

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

搜索结果处理

排序

elasticsearch支持对搜索结果排序,默认是根据相关度算分(_score)来排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。

对酒店数据按照用户评价降序排序,评价相同的按照价格升序排序
GET /hotel/_search
{
  "query": {
    "match_all": {}
  }, 
  "sort": [
    {
      "score": "desc"
      
    },
    {
      "price": "asc"
    }
  ]
}


实现对酒店数据按照到你的位置坐标的距离升序排序
GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "_geo_distance": {
        "location": {
        "lat":31.034661,
        "lon":121.612282
        },
        "order": "asc"
        , "unit": "km"
      }
    }
  ]
}

分页

elasticsearch 默认情况下只返回top10的数据。而如果要查询更多数据就需要修改分页参数了。
elasticsearch中通过修改from、size参数来控制要返回的分页结果:

GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "price": {
        "order": "asc"
      }
    }
  ],
  "from": 0
  , "size": 20
}

分页总结

from + size:
优点:支持随机翻页
缺点:深度分页问题,默认查询上限(from + size)是10000
场景:百度、京东、谷歌、淘宝这样的随机翻页搜索
after search:
优点:没有查询上限(单次查询的size不超过10000)
缺点:只能向后逐页查询,不支持随机翻页
场景:没有随机翻页需求的搜索,例如手机向下滚动翻页
scroll:(淘汰了)
优点:没有查询上限(单次查询的size不超过10000)
缺点:会有额外内存消耗,并且搜索结果是非实时的
场景:海量数据的获取和迁移。从ES7.1开始不推荐,建议用 after search方案。

高亮:把搜索关键字突出显示

高亮,默认情况下,ES搜索字段必须与高亮字段一致

GET /hotel/_search
{
“query”: {
“match”: {
“all”: “如家”
}
},
“highlight”: {
“fields”: {
“name”: {
“require_field_match”: “false”
}
}
}
}

更多推荐