bool查询可以把任意多个简单查询组合在一起。使用must、should、must_not、filter选项来表达各个简单查询之间的逻辑组合关系。每个选项都可以出现0次或者是多次。
must:文档必须匹配must选项下的查询条件。相当于逻辑运算的and
should:文档可以匹配should选项下的查询条件也可以不匹配。相当于逻辑运算的or。
must_not:于must相反。匹配到must_not查询条件的文档不会被返回。相当于逻辑运算的not
filter:功能和must类似。区别在于filter只起到过滤的作用,不对文档进行评分。
GET books/ search
"query": {
"bool": {
"minimum—should一match": 1,}
"must": {
"match": { "title": "java"}}
"should": [
{"match": { "description": " 虚拟机" }}]
must_not": {
"range": {"price": {"gte": 70}}
dis_max
dis max与bool query 有一定联系也有一定区别,dis max query 支持多并发查询。
可返回与任意查询条件子句匹配的任何文档类型。与bool 查询可以将所有匹配查询的分数相
结合使的方式不同,dis 查询只使用最佳匹配查询条件的分数
fonction_score
fonction_score query 可以修改查询的文档得分,这个查询在有些情况下非常有用,比如通
过评分函数计算文档得分代价较高,可以改用过滤器加自定义评分函数的方式来取代传统的评
分方式。
使用fiinction score query , 用户需要定义一个查询和一至多个评分函数,评分函数会对查
询到的每个文档分别计算得分。
boosting
boosting 查询用于需要对两个查询的评分进行调整的场景,boosting 查询会把两个查询封
装在一起并降低其中一个查询的评分
indices
indices query 适用于需要在多个索引之间进行查询的场景,它允许指定一个索引名字列表
和内部查询。indices query 中有query 和no match query 两部分,query 中用于搜索指定索引
列表中的文档,no_match_query 中的查询条件用于搜索指定索引列表之外的文档。
嵌套查询
在Elasticsearch 这样的分布式系统中执行全SQL 风格的连接查询代价昂贵,是不可行的。
相应地,为了实现水平规模地扩展,Elasticsearch 提供了以下两种形式的join:
nested query (嵌套查询)
文档中可能包含嵌套类型的字段,这些字段用来索引一些数组对象,每个对象都可以作为
一条独立的文档被查询出来。
has child query (有子查询)和has_parent query (有父查询)
父子关系可以存在单个的索引的两个类型的文档之间。has_child 查询将返回其子文档能满
足特定查询的父文档,而has_parent 则返回其父文档能满足特定查询的子文档。
has_child
现在有两个索引:员工employee和城市(branch)。类似于数据的两张表。在ES中,员工是child type ,城市是parent type 。需要在映射中声明如下:
PUT /company
"mappings": {
"branch": {},
"employee” {"_parent": { "type": "branch"}}
通过子文档查询父文档需要使用has_child查询。例如,搜索1980 年以后出生的员工所在的
城市。
GET company/branch/_search
"query": {
"has_child": {
"type": "employee",
"query": {
"range": {"birthday": {"gte": "1980-01-01’ }}
has_parent
通过父文档查询子文档使用has_parent 查询。比如,搜索哪些employee 工作在UK, 查询
命令如下:
GET /company/employee/_search
"query": {
"has_parent": {
"paren_type": "branch",
"query": {"match": {"country": "UK"}}
位置查询
Elasticsearch 可以对地理位置点geo_point 类型和地理位置形状geo_shape 类型的数据进行
搜索。
geo_distance、geo_boundin_box、geo_polygon、geo_shape等。需要的时候可以具体的查询API。
特殊查询
more_like_this
more_like_this query 可以查询和提供文本类似的文档,通常用于近似文本的推荐等场景。
script
Elasticsearch 支持使用脚本进行查询。
搜索高亮(略)
搜索排序
默认排序
Elasticsearch 是按照查询和文档的相关度进行排序的,默认按评分降序排序。
对于match_all query 而言,由于只返回所有文档,不需要评分,文档的顺序为添加文档的
顺序。如果需要改变match_all query 的文档返回顺序,可以对_doc 进行排序。例如,返回最
后添加的那条文档, 可以对_doc 降序排序,设置返回文档条数为1 。
多字段排序
如按照价格降序排序,在根据年份升序排序。
GET books/ search
"sort": [
{"price": { "order": "desc"} },
{"year": {"order": "asc"}}]
分片影响评分
ES是在每一个分片上进行单独评分的,分片的数量会影响到评分的结果。。同时,分词器也会
影响评分,原因是使用不同的分词器会使倒排索引中的词项数发生改变,最终影响评分。
示例是一个SQL和SDL对应的关系
SELECT
COUNT(1)
table
WHERE order_type = 'GUARANTEE'
AND STATUS IN (
'FAILED',
'SUCCEEDED',
'REFUNDED',
'UNTESTED',
'UNTRANSFERED',
'TRANSFERED',
'SETTLED',
'APPLYREFUND'
AND id = 306472658
AND time >= "2019-01-01 00:00:00"
AND time <= "2019-03-31 23:59:59"
"bool" : {
"must" : [
"term" : {
"id" : {
"value" : "306472658",
"boost" : 1.0
"term" : {
"order_type" : {
"value" : "GUARANTEE",
"boost" : 1.0
"range" : {
"time" : {
"from" : "20190101000000",
"to" : null,
"include_lower" : true,
"include_upper" : true,
"boost" : 1.0
"range" : {
"time" : {
"from" : null,
"to" : "20190331235959",
"include_lower" : true,
"include_upper" : true,
"boost" : 1.0
"terms" : {
"status" : [
"FAILED",
"SUCCEEDED",
"REFUNDED",
"UNTESTED",
"UNTRANSFERED",
"TRANSFERED",
"SETTLED",
"APPLYREFUND"
"boost" : 1.0
"disable_coord" : false,
"adjust_pure_negative" : true,
"boost" : 1.0