ES中提供了一种强大的检索数据方式,这种检索方式称之为Query DSL(Domain Specified Language领域专用语言) , Query DSL是利用Rest API传递JSON格式的请求体(RequestBody)数据与ES进行交互,这种方式的丰富查询语法让ES检索变得更强大,更简洁。

官方文档

Query DSL | Elasticsearch Guide [8.17] | Elastic

示例数据准备

put employee
{
    "settings":{
        "number_of_shards": 1,
        "number_of_replicas": 1
    },
    "mappings":{
        "properties": {
            "name":{
                "type": "keyword"
            },
            "sex":{
                "type": "integer"
            },
            "age":{
                "type": "integer"
            },
            "address":{
                "type": "text",
                "analyzer": "standard",
                "fields": {
                    "keyword":{
                        "type":"keyword"
                    }
                }
            },
            "remark":{
                "type": "text",
                "analyzer": "standard",
                "fields": {
                    "keyword":{
                        "type":"keyword"
                    }
                }
            }
        }
    }
}
POST /employee/_bulk
{"index":{"_index":"employee","_id":1}}
{
    "name":"张三",
    "sex":1,
    "age":25,
    "address":"广州天河公园",
    "remark":"java developer"
}
{"index":{"_index":"employee","_id":2}}
{
    "name":"李四",
    "sex":1,
    "age":34,
    "address":"在私企负责研发,工作能力还算挺强的",
    "remark":"cailiao"
}
{"index":{"_index":"employee","_id":3}}
{
    "name":"Jasmine",
    "sex":1,
    "age":23,
    "address":"在长沙体制内工作",
    "remark":"在长沙体制内工作"
}
{"index":{"_index":"employee","_id":4}}
{
    "name":"鑫",
    "sex":1,
    "age":30,
    "address":"北京",
    "remark":"运维工程师"
}
{"index":{"_index":"employee","_id":5}}
{
    "name":"鑫",
    "sex":1,
    "age":34,
    "address":"四川德阳人,工作生活在深圳",
    "remark":"律师"
}
{"index":{"_index":"employee","_id":6}}
{
    "name":"Yixuan",
    "sex":1,
    "age":29,
    "address":"湖南常德人",
    "remark":"公办专科院校担任教师"
}

match_all ——匹配所有文档

match_all查询是一个特殊的查询类型,它用于匹配索引中的所有文档,而不考虑任何特定的查询条件。

GET /employee/_search
{
    "query":{
        "match_all": {}
    },
    "size": 10

}

高级用法

例如,如果您想要返回索引中的前10个文档,并且按照文档的评分进行排序,您可以使用以下查询:

GET /employee/_search
{
    "query":{
        "match_all": {}
    },
    "sort": [
      {
        "age": {
          "order": "desc"
        }
      }
    ],
    "from": 2,
    "size": 5

}

_source的用法

不查看源数据,仅查看元字段

GET /employee/_search
{
    "query":{
        "match_all": {}
    },
    "_source": [
      "name","address"
    ],
    "from": 2,
    "size": 5

}

size返回指定条数

from&size分页查询

sort指定字段排序

根据age排序

排序的同时进行分页

GET /employee/_search
{
    "query":{
        "match_all": {}
    },
    "sort": [
      {
        "age": {
          "order": "desc"
        }
      }
    ],
    "from": 2,
    "size": 5

}

精确匹配

精确匹配是指的是搜索内容不经过文本分析直接用于文本匹配,这个过程类似于数据库的SQL查询,搜索的对象大多是索引的非text类型字段。此类检索主要应用于结构化数据,如ID、状态和标签等。

term——单字段精确匹配查询

term检索主要应用于单字段精准匹配的场景。在实战过程中,需要避免将term检索应用于text类型的检索。进一步说,term检索针对的是非text类型,用于text类型时并不会报错,但检索结果一般会达不到预期。

基本语法

在Elasticsearch 8.x中,term查询用于执行精确匹配查询,它适用于未经过分词处理的keyword字段类型。term查询的基本语法如下:

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐