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:

  • 优点:没有查询上限
  • 缺点:会有额外内存消耗,并且搜索结果是非实时的
  • 场景:海量数据的获取和迁移。
相关推荐
Mitch3111 小时前
【漏洞复现】CVE-2015-3337 Arbitrary File Reading
elasticsearch·网络安全·docker·漏洞复现
Mitch3112 小时前
【漏洞复现】CVE-2015-5531 Arbitrary File Reading
web安全·elasticsearch·网络安全·docker·漏洞复现
喝醉酒的小白3 小时前
Elasticsearch(ES)监控、巡检及异常指标处理指南
大数据·elasticsearch·搜索引擎
孤水寒月6 小时前
Git忽略文件.gitignore
git·elasticsearch
LKAI.12 小时前
搭建Elastic search群集
linux·运维·elasticsearch·搜索引擎
it噩梦1 天前
elasticsearch中使用fuzzy查询
elasticsearch
喝醉酒的小白1 天前
Elasticsearch相关知识@1
大数据·elasticsearch·搜索引擎
小小工匠1 天前
ElasticSearch - 深入解析 Elasticsearch Composite Aggregation 的分页与去重机制
elasticsearch·composite·after_key·桶聚合分页
风_流沙1 天前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
TGB-Earnest1 天前
【py脚本+logstash+es实现自动化检测工具】
大数据·elasticsearch·自动化