05 elasticsearch文档的复杂查询

添加数据

PUT /test/_doc/1
{
  "name": "张三",
  "age": 15,
  "desc": "知道的越多,不知道的更多",
  "tag": [
    "程序员",
    "技术宅",
    "抑郁"
  ]
}

PUT /test/_doc/2
{
  "name": "李四",
  "age": 22,
  "desc": "学无止境",
  "tag": [
    "游戏狂",
    "渣滓",
    "阳光"
  ]
}

PUT /test/_doc/3
{
  "name": "王五",
  "age": 22,
  "desc": "无法形容",
  "tag": [
    "旅游",
    "画画",
    "健身"
  ]
}

PUT /test/_doc/4
{
  "name": "法外狂徒张三",
  "age": 15,
  "desc": "法外之地",
  "tag": [
    "唱歌",
    "运动",
    "游泳"
  ]
}

在这里插入图片描述

# 根据id查询某个数据信息
GET /test/_doc/1

在这里插入图片描述

复杂查询
模糊查询

简写的查询语句
select * from _doc where name="%李四%"

# 精确匹配
GET /test/_doc/_search?q=name:李四

# 模糊匹配(注意值的属性不能为keyword;keyword不支持分页)
GET /test/_doc/_search?q=name:

在这里插入图片描述
完整的查询语句

GET test/_doc/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  }
}

查询语句分析:
在这里插入图片描述
查询结果分析:
在这里插入图片描述

查询结果字段过滤

查询结果字段过滤
等同于select name,desc from _doc where name=“张三”

GET test/_doc/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  },
  "_source": ["name","desc"]
}

在这里插入图片描述

排序

select * from _doc where name=“张三” order by age desc

GET test/_doc/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

在这里插入图片描述

分页查询

limit

GET test/_doc/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],
  "from": 0,
  "size": 1
}

在这里插入图片描述

布尔值查询

多条件查询
must(and),所有条件都要符合 ; where name=“张三” and age=7

GET test/_doc/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "张三"
          }
        },
        {
          "match":{
            "age": 7
          }
        }
      ]
    }
  }
}

在这里插入图片描述
should(or),满足其中一个条件 ; where name=“张三” or age=7

GET test/_doc/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "name": "张三"
          }
        },
        {
          "match":{
            "age": 7
          }
        }
      ]
    }
  }
}

在这里插入图片描述
must_not(not) 查询相反条件 ; where age!=7

GET test/_doc/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match":{
            "age": 7
          }
        }
      ]
    }
  }
}

在这里插入图片描述

过滤器
GET test/_doc/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "match":{
            "age": 7
          }
        }
      ],
      "filter":{
        "range":{
          "age":{
            "gt":10,
            "lt":20
          }
        }
      }
    }
  }
}
  • gt 大于
  • gte 大于等于
  • lt 小于
  • lte 小于等于
    在这里插入图片描述
    在这里插入图片描述
匹配多个条件
GET test/_doc/_search
{
  "query": {
    "match": {
      "tag":"运动 技术"
    }
  }
}

在这里插入图片描述

关于分词
  • term ,直接查询精确的
  • match,会使用分词器解析!(先分析文档,然后在通过分析的文档进行查询!|
test与keyword

test会被分词器解析;keyword不会被分词器解析
(即同一个词,与test类型 与 查询条件 只要有一个字匹配上就会查询出 模糊查询;
但是keyword 必须和 查询条件 一模一样才会被匹配上 精准查询)
在这里插入图片描述
在这里插入图片描述

查询高亮
GET test/_doc/_search
{
  "query": {
    "match": {
      "name": "张三"
    }
  },
  "highlight": {
    "pre_tags": "<p class='key' style='color:red'>",
    "post_tags": "</p>",
    "fields": {
      "name": {}
    }
  }
}

在这里插入图片描述

Spring Data Elasticsearch 提供了一种方便的方式来操作 Elasticsearch。下面是使用 Spring Data Elasticsearch4.1.0 操作复杂文档的教程。 1. 添加 Maven 依赖 在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> <version>4.1.0</version> </dependency> ``` 2. 创建实体类 创建一个实体类来表示 Elasticsearch 中的文档,例如: ```java @Document(indexName = "blog", createIndex = false) public class Blog { @Id private String id; @Field(type = FieldType.Keyword) private String title; @Field(type = FieldType.Text) private String content; @Field(type = FieldType.Date) private Date createTime; // getters and setters } ``` 在实体类上使用 `@Document` 注解来指定索引的名称,并使用 `@Field` 注解来指定每个字段的类型。 3. 创建 ElasticsearchRepository 创建一个 `ElasticsearchRepository` 接口,继承自 `org.springframework.data.elasticsearch.repository.ElasticsearchRepository` 接口,例如: ```java public interface BlogRepository extends ElasticsearchRepository<Blog, String> { List<Blog> findByTitleOrContent(String title, String content); List<Blog> findByCreateTimeBetween(Date start, Date end); } ``` `ElasticsearchRepository` 接口提供了许多常用的 Elasticsearch 操作方法,例如 `save`、`findById`、`delete` 等。在这个示例中,我们还定义了两个自定义查询方法。 4. 使用 ElasticsearchRepository 在代码中,可以使用 `BlogRepository` 对 Elasticsearch 进行操作,例如: ```java @Autowired private BlogRepository blogRepository; public void saveBlog(Blog blog) { blogRepository.save(blog); } public Blog getBlogById(String id) { Optional<Blog> optionalBlog = blogRepository.findById(id); return optionalBlog.orElse(null); } public List<Blog> searchBlogs(String keyword) { return blogRepository.findByTitleOrContent(keyword, keyword); } public List<Blog> getBlogsByCreateTime(Date start, Date end) { return blogRepository.findByCreateTimeBetween(start, end); } ``` 通过 `BlogRepository` 的方法可以操作 Elasticsearch 中的文档,例如保存文档、根据 ID 获取文档、搜索文档等。 以上就是使用 Spring Data Elasticsearch4.1.0 操作复杂文档的教程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岿然如故

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值