1、领域特定语言(DSL)查询
ES提供了基于JSON的DSL查询,ES会将DSL查询作为AST查询
1.1、叶子查询子句
叶子查询子句在特定字段上查找特定的值,例如match,term或者range查询,这些查询可以被自行使用;
1.2、复合查询子句
复合查询子句包装其他叶子查询或者复合查询,并使用逻辑方式组合多个查询(例如bool查询或dis_max查询),或者更改展现方式(例如constant_score查询);
1.3、查询代价比较高的查询
不同的查询因其实现方式的差异导致在执行速度上会有差异,同时会影响集群的稳定性,查询代价比较高的查询可分为以下几类:
序号 | 字段及说明 | 上下文 |
1 | 需要进行线性扫描以识别匹配项的查询 | 脚本(script)查询; |
2 | 首次代价比较高的查询 | 模糊(fuzzy)查询 |
正则(regexp)查询 | ||
未设置index_prefixes参数的前缀(prefix)查询 | ||
通配符(wildcard)查询 | ||
3 | join查询 | |
4 | 已过期的geo shape查询 | |
5 | 查询每个文档代价比较高的查询 | 脚本(script)查询分数 |
过滤(percolate)查询 |
tips:若不想以上耗时的查询被执行,可以设置全局的参数:search.allow_expensive_queries为false,默认为true;
2、查询上下文与过滤上下文
默认情况下ES会将查询结果按照相似度分数(表示文档与查询内容的相似度)进行排序;
相似度分数在查询结果中以_score字段表示,为正浮点数;_score值越大表示文档与查询内容相似度越高;
相似度分数不仅与查询类型有关,还与查询子句有关(主要指查询上下文与过滤上下文);
2.1、查询上下文
查询上下文中查询子句回答’文档与查询子句的匹配程度’的问题,其不仅仅确定文档是否匹配,还会计算相似度分数以_score字段来表示;
查询子句在API调用中通过query参数传递到查询上下文当中;
2.2、过滤上下文
过滤上下文中查询子句回答’文档与查询子句是否匹配’,结果为布尔类型且不会计算相似度分数;
过滤上下文主要用于过滤结构化的数据,例如:
1)、时间字段timestamp的值是否落在2020与2021之间;
2)、状态字段status的值是否为1;
使用频率高的过滤子句过滤的结果将会被ES自动缓存,用于提高性能;
过滤子句在API调用中通过filter参数传递到过滤上下文当中,例如:布尔(bool)查询中的filter或must_not参数,常数分(constant_score)查询中的filter参数或者聚合filter查询中;
查询上下文与过滤上下文示例
GET _search
{
"query": {
"bool": {
"must": [
{
"match": {
"title": "Search"
}
},
{
"match": {
"content": "Elasticsearch"
}
}
],
"filter": [
{
"term": {
"status": 1
}
},
{
"range": {
"date": {
"gte": "2020-6-01"
}
}
}
]
}
}
}
查询参数说明:
序号 | 字段及说明 | 上下文 |
1 | title字段中必须包含 | 查询上下文 |
2 | content字段中必须包含 | 查询上下文 |
3 | status字段值必须等于 | 过滤上下文 |
4 | date字段值必须要 | 过滤上下文 |
tips:查询上下文中相似度分数结果为24位单精度数值,超过这个24位精度的数值将会被截断;
3、复合查询
复合查询可以包装其他复合查询或叶子查询,用于组装其结果和分数,或用于更改其行为,或从查询上下文切换到过滤上下文;