ElasticSearchDSL

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:

  • 优点:没有查询上限
  • 缺点:会有额外内存消耗,并且搜索结果是非实时的
  • 场景:海量数据的获取和迁移。
相关推荐
Elasticsearch9 小时前
Elasticsearch:使用 AI Agent 来创建 workflows
elasticsearch
gll77311 小时前
RAG 检索层实战:Redis 缓存 + ES 混合检索 + BGE-Rerank 重排全链路落地与踩坑
elasticsearch
Elasticsearch12 小时前
ES 存日志很贵?我用 ES 9.5 把日志从 4.5G 压到 412M 压缩比11.2倍,日志硬扫每秒128万行!
elasticsearch
Elasticsearch15 小时前
Elasticsearch 作为统一平台:引入第二套数据系统究竟要付出什么代价
elasticsearch
Elastic 中国社区官方博客15 小时前
Elasticsearch:列式索引模式 - Columnar index mode
大数据·数据库·elasticsearch·搜索引擎·全文检索
Elasticsearch15 小时前
Elasticsearch 的批量查询阶段如何在大规模场景下提升搜索性能
elasticsearch
Ramboooooooo17 小时前
SkyWalking-10.4.0 Docker + Nacos + Elasticsearch 生产级部署手册
elasticsearch·docker·skywalking
互联网中的一颗神经元1 天前
04 — 安全撤销:改错了怎么退回去
大数据·安全·elasticsearch
Elasticsearch1 天前
Elasticsearch:列式索引模式 - Columnar index mode
elasticsearch
Elasticsearch2 天前
从 CrashLoopBackOff 到根本原因,只需几秒:使用 Elastic Observability 自动化 20 分钟的 Kubernetes 调查流
elasticsearch