专业的编程技术博客社区

网站首页 > 博客文章 正文

DSL文档查询(文档查询系统)

baijin 2024-10-24 08:46:25 博客文章 8 ℃ 0 评论

DSL分类

  • 查询所有数据
  • 全文检索(full text ): 查询内容由分词器分词后,去倒序索引库查询。

match_query

multi_match_query

  • 精确查询:根据词条值精确查找数据。
  • 地理查询:根据经纬度。
  • 复合查询:可以将上述条件组合起来,一起查询。


查询语法:

GET /索引库名称/_search
{
					"query": {
          			"查询类型": {
                			"查询条件": "条件值"
                }
          }
}


全文检索查询

match : 单字段查询

GET /索引库名称/_search
{
  "query": {
  			"match": {
        			"要查询的字段" : "要查询的内容"
        }
  }
}

multi_match : 多字段查询

 GET /索引库名称/_search
{
		"query":{
    		"multi_match": {
        			"query": "要查询的内容",
                "fields": ["查询字段1","查询字段2"]
        
        }
    }
}

精准查询

精准查询一般查找keyword、数值、日期、boolean等类型字段。

term : 查询内容不分词

GET /索引库名称/_search
{
		"query" : {
    		"term" : {
        			"查询字段" : {
              		"value": "查询的值"
              } 
        }
    }
}

range : 范围查询

GET /索引库名称/_search
{
		"query" : {
    			"range": {
          		"查询字段": {
              				"gte" : 值1,   //大于等于
                        "lte" :值2  //小于等于
              }
          }
    
    }

}

地理坐标查询

纬线用来表示南北方向,经线用来表示东西方向。

矩形范围查询

geo_bounding_box : 查询坐标所在某个矩形内的所有文档。

GET /索引库名称/_search
{
		"query": {
    			"geo_bounding_box": {
          			"查询的字段" : {
                				"top_left" : {
                        		"lat" :  纬度 ,
                             "lon" :  经度
                        },
                        "bottom_right": {
                        			"lat" : 纬度,
                                "lon": 经线
                          
                          }
                
                }
          
          }
      
    }

}

附近查询

geo_distance: 查询指定中心范围内的所有文档

GET /索引库名称/_search
{
		"query" : {
    			"geo_distance": {
          		"distance" :  "半径范围",
                "查询字段": "经度 , 纬度"
          
          }
    
    }
}

复合查询

复合(compound)查询: 组合简单查询,实现复杂逻辑。

function score: 算分函数查询。控制分档排名

bool query: 布尔查询,利用逻辑关系组合其它查询,实现复杂查询

算分函数查询

GET /索引库名称/_search
{
		"query": {},
      "functions" : [{
      			"filter" : {},
        		"weight": 权重值
        
      }],
      "boost_mode" : 加权模式 

}

function score查询四部分:

原始查询: query部分,基于BM25算法。

过滤条件: filter 部分,符号条件的文档重新算法

算分函数: 符合filter条件的文档,根据函数做运算。

四种函数:

weight: 函数结果是场量

field_value_factor: 文档中的某个字段作为函数结果

random_score: 随机数作为函数结果

script_score: 自定义算法函数算法


运算模式: 算分函数、原始查询相关性算分,两者之间的运算方法。

multiply: 相乘

replace: 用function score替换query score

其他,sum,avg,max,min


布尔查询

子查询的组合方式:

must: 类似 与

should:类似 或

must_not:类似 非

filter: 必须匹配,不参与算法

GET  /索引库名称/_search
{
	"query": {
  		"bool": {
      			"must":[
            		
            ],
             "should": [
             
             ],
             "must_not": [
             
             ],
             "filter": [
             
             ]
      }
  }
}


排序

es默认排序是根据相关度算分,也支持自定义方式对搜索结果排序。

可以排序的字段有:keyword、数值类型、地理坐标、日期等。

普通字段排序

GET /索引库名称/_search
{
		"query": {
    			"match_all" : []
    },
     "sort": [
       {
       		"排序字段" : "desc" //desc 降序 asc 升序
       }
     ]
}

地理坐标排序

GET /indexName/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
    	"_geo_distance" : {
      		"字段": "纬度,经度", //文档字段,目标坐标
        "order": "asc", // 排序方式 升序
        "unit": "km" //排序单位
      }
    }
    ]
}

分页

基本分页

GET /hotel/_search
{
  "query": {
    "match_all": {}
  },
    "from" : 0, //分页开始位置
      "size" : 10, //获取文档数量
        "sort":[
          {"price": "asc"}
        ]

深度分页

单系统影响不大,但是集群影响比较严重,牵扯到数据的汇总。

汇总数据过多,对内存和CPU会产生非常大的压力,因此elasticsearch会禁止from+ size 超过10000的请求。

针对深度分页,ES两种解决方案:

search after: 分页时需要排序,原理,从上一次排序的值开始,查询下一页的数据。

scroll: 原理排序后文档id形成快照,保存到内存。官方不推荐使用。

小结

分页查询的常见实现方案以及优缺点:

  • from + size
    • 优点:支持随机翻页
    • 缺点:深度分页问题,默认查询上限(from + size)是10000
    • 场景:百度、京东、谷歌、淘宝这样的随机翻页搜索
  • after search
    • 优点:没有查询上限(单次查询的size不超过10000)
    • 缺点:只能向后逐页查询,不支持随机翻页
    • 场景:没有随机翻页需求的搜索,例如手机向下滚动翻页
  • scroll
    • 优点:没有查询上限(单次查询的size不超过10000)
    • 缺点:会有额外内存消耗,并且搜索结果是非实时的
    • 场景:海量数据的获取和迁移。从ES7.1开始不推荐,建议用 after search方案。

高亮

GET /hotel/_search
{
  "query": {
    "match": {
      "FIELD": "TEXT" // 查询条件,高亮一定要使用全文检索查询
    }
  },
    "highlight":{
    	"fields":{
      		"高亮字段":{
          			"pre_tags" : "<em>",
                 "post_tags" : "</em>"
          }
      }
    }
}

注意:

非搜索字段高亮,则需要添加一个属性:required_field_match=false

没有高亮的情况:

搜索的条件没有关键字。

高亮字段跟搜索字段不一致。

总结

DSL查询语句:

query: 查询条件

from和size: 分页

sort: 排序

highlight: 高亮条件

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表