专业的编程技术博客社区

网站首页 > 博客文章 正文

ElasticSearch的进阶检索(elastic search 教程)

baijin 2024-10-13 01:15:09 博客文章 12 ℃ 0 评论

我们做es查询的时候的,如果不会经常使用,会忘记了基本的DSL语句,这里相当于做个笔记吧。

检索的数据来自

https://gitee.com/xlh_blog/common_content/blob/master/es%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE.json

1 排序


GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "balance": {
        "order": "desc"
      }
    }
  ]
}

分页

GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "balance": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 100
}

分页查询,我们用from 从那个id开始,size表示每页多少条数据

-source

source指定我们要显示的字段

GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "balance": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 100,
  "_source": ["balance","firstname"]
 }

match 匹配

比如匹配account_number为20的记录 ,match如果匹配一个非字符的就是一个精确匹配,match也进行模糊匹配

GET bank/_search
{
  "query": {
    "match": {
      "account_number": 20
    }
  }
}

短语匹配

短语匹配,会让整个关键字作为一个整体去匹配

GET /bank/_search
{
  "query": {
    "match_phrase": {
      "firstname": "West"
    }
  }
}

multi_match 多字段匹配

用多个字段是匹配一个关键字

GET /bank/_search
{
  "query": {
    "multi_match": {
      "query": "mill",
      "fields": ["firstname","address","city"]
    }
  }
}

bool复合查询

复合查询用于合并多个查询条件,must必须都满足,mustnot必须都不满足

GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "gender": "M"
          }
        },
        {
          "match": {
            "address": "mill"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "age": "28"
          }
        }
      ],
      "should": [
        {"match": {
          "lastname": "wallace"
        }}
      ]
    }
  }
}

filter

filter是对查询条件进行过滤,但是不统计相关性得分

GET /bank/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "age": {
              "gte": 20,
              "lte": 30
            }
          }
        }
      ]
    }
  }
}

term用于数值进行精准匹配,比如年龄,薪水等,但是全文匹配建议用match

GET /bank/_search
{
  "query": {
    "term": {
      "age": {
        "value": "20"
      }
    }
  }
}

aggregations(执行聚合)

聚合提供了从数据中分组和提取数据的能力。最简单的聚合方法大致等于 SQL GROUP BY SQL 聚合函数。在 Elasticsearch 中,您有执行搜索返回 hits(命中结果),并且同时返 回聚合结果,把一个响应中的所有 hits(命中结果)分隔开的能力。这是非常强大且有效的, 您可以执行查询和多个聚合,并且在一次使用中得到各自的(任何一个的)返回结果,使用 一次简洁和简化的 API 来避免网络往返。

1.搜索address中包含mill的所有人的年龄分布以及平均年龄,但不显示这些人的详情

GET /bank/_search
{
  "query": {
    "match": {
      "address": "mill"
    }
  },
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 10
      }
    }
  }
}
2.复杂:按照年龄聚合,并且请求这些年龄段的这些人的平均薪资
{
  "query": {
    "match": {
      "address": "mill"
    }
  },
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age",
        "size": 10
      }
    },
    "ageavg":{
      "avg": {
        "field": "age"
      }
    },
    "balanceAvg":{
      "avg": {
        "field": "balance"
      }
    }
  }
}

2.多级聚合,对聚合结果再做聚合

查出所有年龄分布,并且这些年龄段中 M 的平均薪资和 F 的平均薪资以及这个年龄 段的总体平均薪资

GET /bank/_search
{
  "query": {
    "match_all": {
      
    }
  }, 
  "aggs": {
    "ageAgg": {
      "terms": {
        "field": "age"
      }
      , "aggs": {
        "balanceAvg": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  },
  "size": 0
}

查出年龄分布,这些年龄段中F和M的平均薪资

GET /bank/_search
{
  "query": {"match_all": {
    
  }},
  "aggs": {
    "aggAgg": {
      "terms": {
        "field": "age",
        "size": 20
      },
      "aggs": {
        "genderAgg": {
          "terms": {
            "field": "gender.keyword",
            "size": 10
          }
          , "aggs": {
            "balanceAvg": {
              "avg": {
                "field": "balance"
              }
            }
          }
        }
      }
    }
  }
  , "size": 0
}

可以看出这里做了3层的聚合,年龄聚合,性别聚合。平均薪资的聚合

2、映射

Mapping(映射)
Mapping 是用来定义一个文档(document),以及它所包含的属性(field)是如何存储和 索引的。比如,使用 mapping 来定义:

? 哪些字符串属性应该被看做全文本属性(full text fields)。 ? 哪些属性包含数字,日期或者地理位置。
? 文档中的所有属性是否都能被索引(_all 配置)。
? 日期的格式。

? 自定义映射规则来执行动态添加属性。

2.1查询映射

GET /bank/_mapping

新版本改变

Es7 及以上移除了 type 的概念。
? 关系型数据库中两个数据表示是独立的,即使他们里面有相同名称的列也不影响使用,

但 ES 中不是这样的。elasticsearch 是基于 Lucene 开发的搜索引擎,而 ES 中不同 type 下名称相同的 filed 最终在 Lucene 中的处理方式是一样的。
? 两个不同type下的两个user_name,在ES同一个索引下其实被认为是同一个filed,

你必须在两个不同的 type 中定义相同的 filed 映射。否则,不同 type 中的相同字段

名称就会在处理中出现冲突的情况,导致 Lucene 处理效率下降。 ? 去掉type就是为了提高ES处理数据的效率。

Elasticsearch 7.x
? URL中的type参数为可选。比如,索引一个文档不再要求提供文档类型。 Elasticsearch 8.x
? 不再支持URL中的type参数。
解决:

1)、将索引从多类型迁移到单类型,每种类型文档一个独立索引 2)、将已存在的索引下的类型数据,全部迁移到指定位置即可。详见数据迁移.

2.2、创建索引并指定映射

 PUT /my-index 


2.3更新映射

对于已经存在的映射字段,我们不能更新。更新必须创建新的索引进行数据迁

2.4数据迁移
先创建出 new_twitter 的正确映射。然后使用如下方式进行数据迁移

POST _reindex {
"source": {
"index": "twitter"
}, "dest": {
"index": "new_twitter" }
}

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

欢迎 发表评论:

最近发表
标签列表