ES领域特定语言(DSL)查询_9

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字段中必须包含search字段 查询上下文
2 content字段中必须包含elasticsearch字段 查询上下文
3 status字段值必须等于1 过滤上下文
4 date字段值必须要大于2020-06-01 过滤上下文

tips:查询上下文中相似度分数结果为24位单精度数值,超过这个24位精度的数值将会被截断;

3、复合查询

复合查询可以包装其他复合查询或叶子查询,用于组装其结果和分数,或用于更改其行为,或从查询上下文切换到过滤上下文;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章