目录
DSL查询分类
全文检索查询
match查询:
multi_match:
精准查询
地理坐标查询
矩形范围查询
中心点范围
组合查询
elasticsearch中的相关性打分算法是什么?
案例——给“如家”这个品牌的酒店排名靠前一些
function score query定义的三要素是什么?
复合查询 Boolean Query
案例——搜索名字包含“如家”,价格不高于400,在坐标31.21,121.5周围10km范围内的酒店
DSL查询分类
查询所有:查询出所有数据,一般测试用。例如:match_all
全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:
match_query
multi_match_query
精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:
ids
range
term
地理(geo)查询:根据经纬度查询。例如:
geo_distance
geo_bounding_box
复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。例如: bool
function_score
GET /indexName/_search
{
"query": {
"查询类型": {
"查询条件": "条件值"
}
}
}
全文检索查询
match查询:
全文检索查询的一种,会对用户输入内容分词,然后去倒排索引库检索,语法:
GET /indexName/_search
{
"query": {
"match": {
"FIELD": "TEXT"
}
}
}
multi_match:
与match查询类似,只不过允许同时查询多个字段,语法:
GET /indexName/_search
{
"query": {
"multi_match": {
"query": "TEXT",
"fields": ["FIELD1", " FIELD12"]
}
}
}
match:根据一个字段查询
multi_match:根据多个字段查询,参与查询字段越多,查询性能越差
精准查询
精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词。常见的有: term:根据词条精确值查询 range:根据值的范围查询
GET /hotel/_search
{
"query": {
"term": {
"all": {
"value": "北京上海"
}
}
}
}
这里由于不会分词,就查不出来结果
GET /hotel/_search
{
"query": {
"range": {
"price": {
"gte": 100,
"lte": 200
}
}
}
}
对价格一般范围查询
term查询:根据词条精确匹配,一般搜索keyword类型、数值类型、布尔类型、日期类型字段 range查询:根据数值范围查询,可以是数值、日期的范围
地理坐标查询
根据经纬度查询:
携程:搜索我附近的酒店
滴滴:搜索我附近的出租车
微信:搜索我附近的人
矩形范围查询
GET /hotel/_search
{
"query": {
"geo_bounding_box":{
"location":{
"top_left":{
"lat":31.1,
"lon":121.5
},
"bottom_right":{
"lat":30.9,
"lon":121.7
}
}
}
}
}
中心点范围
GET /hotel/_search
{
"query": {
"geo_distance":{
"distance":"15km",
"location":"31.21,121.5"
}
}
}
组合查询
复合(compound)查询:复合查询可以将其它简单查询组合起来,实现更复杂的搜索逻辑,例如:
fuction score:算分函数查询,可以控制文档相关性算分,控制文档排名。例如百度竞价
当我们利用match查询时,文档结果会根据与搜索词条的关联度打分(_score),返回结果时按照分值降序排列。
elasticsearch中的相关性打分算法是什么?
TF-IDF:在elasticsearch5.0之前,会随着词频增加而越来越大
BM25:在elasticsearch5.0之后,会随着词频增加而增大,但增长曲线会趋于水平
使用 function score query,可以修改文档的相关性算分(query score),根据新得到的算分排序。
案例——给“如家”这个品牌的酒店排名靠前一些
哪些文档需要算分加权?
品牌为如家的酒店
算分函数是什么?
weight就可以
加权模式是什么?
求和
GET /hotel/_search
{
"query": {
"function_score": {
"query": {"match": {
"all": "外滩"
}},
"functions": [ //算分函数
{
"filter": {"term": { // 满足的条件,品牌(精准查询)必须是如家
"brand": "如家"
}},
"weight": 10 // 算分权重为10
}
]
, "boost_mode": "sum"
}
}
}
function score query定义的三要素是什么?
过滤条件:哪些文档要加分
算分函数:如何计算function score
加权方式:function score 与 query score如何运算
复合查询 Boolean Query
布尔查询是一个或多个查询子句的组合。子查询的组合方式有:
must:必须匹配每个子查询,类似“与”
should:选择性匹配子查询,类似“或”
must_not:必须不匹配,不参与算分,类似“非”
filter:必须匹配,不参与算分
案例——搜索名字包含“如家”,价格不高于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
}
}
}
]
}
}
}