1、DSL查询分类
Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括:
查询所有:查询出所有数据,一般测试用。例如:match all
全文检索(fulltext)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如:
match_query
multi_match_query
精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如:
ids
range
term
地理(geo)查询:根据经纬度查询。例如:
geo_distance
geo_bounding box
复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件。例如:
bool
function_score
2、查询
查询DSL的基本语法是什么?
GET /索引库名/_search
{"query":{"查询类型":{"FIELD":"TEXT"}}}
示例:
GET /hotel/_search
{
"query": {
"match_all": {}
}
}
1、全文检索查询
match和multi match的区别是什么?
match:根据一个字段查询
multi match:根据多个字段查询,参与查询字段越多,查询性能越差
可以利用copy_to将多个字段放到一个字段中专门用于查询
# match查询
GET /hotel/_search
{
"query": {
"match": {
"{all}": "城隍庙"
}
}
}
# multi_match查询
GET /hotel/_search
{
"query": {
"multi_match": {
"query": "外滩如家",
"fields": ["name","brand"]
}
}
}
2、精确查询
精确查询常见的有哪些?
term查询:根据词条精确匹配,一般搜索keyword类型、数值类型、布尔类型、日期类型字段
range查询:根据数值范围查询,可以是数值、日期的范围
#term查询
GET /hotel/_search
{
"query": {
"term": {
"brand": {
"value": "如家"
}
}
}
}
#range查询
GET /hotel/_search
{
"query": {
"range": {
"price": {
"gte": 10,
"lte": 2000
}
}
}
}
ps:gte意为大于等于,lte反之,gt意为大于,lt反之
3、地理坐标查询
#distance查询
GET /hotel/_search
{
"query": {
"geo_distance":{
"distance":"1km",
"location":"31.21 , 121.5"
}
}
}
指定距离和中心点的经纬度,中心点以距离为半径的圆内的数据便会被选中
4、组合查询
复合(compound)查询:复合查询可以将其它简单查询组合起来,实现更复杂的搜索逻辑,例如: fuction score:算分函数查询,可以控制文档相关性算分,控制文档排名。例如百度竞价
elasticsearch中的相关性打分算法是什么?
TF-IDF:在elasticsearch5.0之前,会随着词频增加而越来越大
BM25:在elasticsearch5.0之后,会随着词频增加而增大,但增长曲线会趋于水平
function score query定义的三要素是什么?
过滤条件:哪些文档要加分
算分函数:如何计算function score
加权方式:function score 与 query score如何运算
#function score查询
GET /hotel/_search
{
"query": {
"function_score": {
"query": {"match": {
"{all}": "外滩"
}},
"functions": [
{
"filter": {"term": {"brand": "如家"}},
"weight": 10
}
],
"boost_mode": "sum"
}
}
}
复合查询boolean query
布尔查询是一个或多个查询子句的组合。子查询的组合方式有:
must:必须匹配每个子查询,类似“与”
should:选择性匹配子查询,类似“或”
must not:必须不匹配,不参与算分,类似“非”
filter:必须匹配,不参与算分
ps:参与算分的条件越多,性能越差
GET /hotel/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"name": {
"value": "如家"
}
}
}
],
"must_not": [
{
"range": {
"price": {
"gt": 400
}
}
}
],
"filter": [
{
"geo_distance": {
"distance": "10km",
"location": {
"lat": 31.21,
"lon": 121.5
}
}
}
]
}
}
}