ElasticSearchDSL
DSL Query的分类
- 查询所有:查询出所有数据,一般测试用。match_all
- 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中进行匹配。例如:
- match_query
- multi_match_query
- 精确查询:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段。例如
- ids
- range
- term
- 地理(geo)查询:根据经纬度查询。例如:
- geo_distance
- geo_bounding_box
- 复合(compound)查询:复合查询可以将上述各种查询条件组合起来,合并查询条件
- bool
- function_score
DSL Query基本语法
查询的基本语法如下:
api
GET /indexName/_search
{
"query":{
"查询类型":{
"查询条件":"条件值"
}
}
}
全文检索查询:
match查询:全文检索查询的一种,会对用户输入内容分词,然后去倒排索引库检索,语法:
java
GET /indexName/_search
{
"query":{
"match":{
"FIELD":"TEXT"
}
}
}
multi_match:与match查询类似,只不过允许同时查询多个字段,语法:
java
GET /indexName/_search
{
"query":{
"multi_match":{
"query":"TEXT",
"fields":["FIELD1" , "FIELD2"]
}
}
}
match和multi_match的区别:
- match:根据一个字段查询
- multi_match:根据多个字段查询,参与查询字段越多,查询性能越差
精确查询
精确查询一般是查找keyword、数值、日期、boolean等类型字段。所以不会对搜索条件分词
term查询:
java
GET /indexName/_search
{
"query":{
"term":{
"FIELD":{
"value":"VALUE"
}
}
}
}
range查询:
java
GET /idnexName/_search
{
"query":{
"range":{
"FIELD":{
"gte":10,
"lte":20
}
}
}
}
地理查询
- geo_bounding_box:查询geo_point值落在某个矩形范围的所有文档
java
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:查询到指定中心点小于某个距离值的所有文档
java
GET /indexName/_search
{
"query":{
"geo_distance":{
"distance":"15km",
"FIELD":"31.21,121.5"
}
}
}
复合查询
复合查询:将其他的简单查询组合起来,实现更复杂的搜索逻辑,例如:
- function score:算分函数查询,可以控制文档相关性算分,控制文档排名,例如百度竞价
elasticsearch中的相关性打分算法是什么?
- TF-IDF:在elasticsearch5.0之前,会随着词频增加而越来越大
- BM25:在elasticsearch5.0之后,会随着次品增加而增大,但增长曲线会趋于水平
Function Score Query
使用function score query,可以修改文档的相关性算分,根据新得到的算分排序
算分函数的结果称为function score , 将来会与query score运算,得到新算分,常见的算分函数有:
- weight:给一个常量值,作为函数结果
- field_value_factor:用文档中的某个字段值作为函数结果
- random_score:随机生成一个值,作为函数结果
- script_score:自定义计算公式,公式结果作为函数结果
甲醛模式,定义functionscore与queryscore的运算方式,包括:
- multiply:两者相乘。默认就是这个
- replace:用function score替换query score
- 其他:sum、avg、max、min
function score query定义的三要素是什么
- 过滤条件:哪些文档要加分
- 算分函数:如何计算function score
- 加权方式:function score 与 query score如何运算
复合查询 Boolean Query
布尔查询是一个或多个查询子句的组合。子查询的组合方式有:
布尔查询是一个或多个查询子句的组合。子查询的组合方式有:
- must:必须匹配每个子查询,类似"与"
- should:选择性匹配子查询,类似"或"
- must_not:必须不匹配,不参与算分,类似"非"
- filter:必须匹配,不参与算分
排序
elasticsearch支持对搜索结果排序,默认是根据相关度算分来排序。可以排序字段类型有:keyword类型、数值类型、地理坐标类型、日期类型等。
分页
from+size:
- 优点:支持随机翻页
- 缺点:深度分页问题,默认查询上限(from+size)是10000
- 场景:百度、京东、谷歌这样的随机翻页搜索
after search:
- 优点:没有查询上限(单词查询的size不超过10000)
- 缺点:只能向后逐页查询,并且搜索结果是非实时的
- 场景:没有随机翻页需求的搜索,例如手机向下滚动翻页
scroll:
- 优点:没有查询上限
- 缺点:会有额外内存消耗,并且搜索结果是非实时的
- 场景:海量数据的获取和迁移。