java操作ES的操作

package com.dp.elasticsearch;

import com.dp.mybatis.pojo.User;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpHost;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.client.indices.GetIndexResponse;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.ArrayList;

@SpringBootTest
public class EsText {

    private static RestHighLevelClient esClient;

    static {
        esClient = new RestHighLevelClient(
                RestClient.builder(new HttpHost("10.121.104.190", 9200, "http")));
    }

    @Test //创建索引
    public void ESTestIndexCreate() throws IOException {
        CreateIndexRequest request = new CreateIndexRequest("user");
        CreateIndexResponse response = esClient.indices().create(request, RequestOptions.DEFAULT);
        System.out.println(response.isAcknowledged()); //true
        esClient.close();
    }

    @Test //查询索引
    public void ESTestIndexSearch() throws IOException {
        GetIndexRequest request = new GetIndexRequest("user");
        GetIndexResponse response = esClient.indices().get(request, RequestOptions.DEFAULT);
        System.out.println("======");
        System.out.println(response.getAliases()); //{test=[]}
        System.out.println(response.getMappings()); //{test=org.elasticsearch.cluster.metadata.MappingMetaData@e99b5c5d}
        System.out.println(response.getIndices()); //[Ljava.lang.String;@503f91c3
        System.out.println(response.getDefaultSettings()); //{}
        System.out.println(response.getSettings()); //{test={"index.creation_date":"1637564349484","index.number_of_replicas":"1","index.number_of_shards":"5","index.provided_name":"test","index.uuid":"SNoFaMfGSEiX_0KBj8JYqQ","index.version.created":"6080099"}}
        esClient.close();
    }

    @Test //删除索引
    public void ESTestIndexDelete() throws IOException {
        DeleteIndexRequest request = new DeleteIndexRequest("user");
        AcknowledgedResponse response = esClient.indices().delete(request, RequestOptions.DEFAULT);
        System.out.println(response.isAcknowledged()); //true
        esClient.close();
    }

    //============================上面的是索引操作,下面是文档操作===============================

    @Test //添加文档 我目前使用的es6.8.0的,还需要type,es7以后的就可以不用type了,我目前还需要用...
    public void ESTestDocInsert() throws IOException {
        IndexRequest request = new IndexRequest();
        request.index("user").type("_doc").id("1");
        User user = new User();
        user.setId((long) 1);
        user.setName("张三");
        user.setAge(23);
        String userJson = new ObjectMapper().writeValueAsString(user);
        request.source(userJson, XContentType.JSON);
        IndexResponse response = esClient.index(request, RequestOptions.DEFAULT);
        System.out.println(response.getResult()); //CREATED
        System.out.println(response.getId()); //1
        System.out.println(response.getShardInfo()); //ShardInfo{total=2, successful=1, failures=[]}
        esClient.close();
    }

    @Test //查询文档 其中的email是操作数据库的类,不想新建了,就用这个了,不用在意。如果实在很在意,可以将类中的email删除,或者在email类中放置该注解@JsonIgnore
    public void ESTestDocSearch() throws IOException {
        GetRequest request = new GetRequest();
        request.index("user").type("_doc").id("1");
        GetResponse response = esClient.get(request, RequestOptions.DEFAULT);
        System.out.println(response.getSource()); //{name=张三, id=1, age=23, email=null}
        esClient.close();
    }

    @Test //更新操作
    public void ESTestDocUpdate() throws IOException {
        UpdateRequest request = new UpdateRequest();
        request.index("user").type("_doc").id("1");
        request.doc(XContentType.JSON, "age", 34, "name", "李四");
        UpdateResponse response = esClient.update(request, RequestOptions.DEFAULT);
        System.out.println(response.status()); //Ok
        esClient.close();
    }

    @Test //删除文档
    public void ESTestDocDelete() throws IOException {
        DeleteRequest request = new DeleteRequest();
        request.index("user").type("_doc").id("1");
        DeleteResponse response = esClient.delete(request, RequestOptions.DEFAULT);
        System.out.println(response.status()); //OK
        esClient.close();
    }

    //============================上面是文档操作,下面是批量操作(多文档操作)===============================

    @Test //批量新增文档
    public void ESTestDocInsertBatch() throws IOException {
        BulkRequest request = new BulkRequest();
        ArrayList<User> list = new ArrayList<>();
        list.add(new User((long) 1, "张三", 23));
        list.add(new User((long) 2, "李四", 24));
        list.add(new User((long) 3, "王五", 25));
        list.add(new User((long) 4, "赵六", 26));
        list.add(new User((long) 5, "周七", 27));
        for (int i = 1; i <= list.size(); i++) {
            IndexRequest source = new IndexRequest().index("user").type("_doc").id(i + "").source(new ObjectMapper().writeValueAsString(list.get(i - 1)), XContentType.JSON);
            request.add(source);
        }
        BulkResponse responses = esClient.bulk(request, RequestOptions.DEFAULT);
        System.out.println(responses.getTook()); //15ms
        esClient.close();
    }

    @Test //批量操作文档
    public void ESTestDocDeleteBatch() throws IOException {
        BulkRequest request = new BulkRequest();
        request.add(new DeleteRequest().index("user").type("_doc").id("1"));
        request.add(new DeleteRequest().index("user").type("_doc").id("2"));
        request.add(new DeleteRequest().index("user").type("_doc").id("3"));
        BulkResponse response = esClient.bulk(request, RequestOptions.DEFAULT);
        System.out.println(response.getTook()); //6ms
        esClient.close();
    }

    //============================上面是批量操作(多文档操作),下面是复杂查询操作===============================

    @Test //查询user索引下的所有数据
    public void ESTestDocQuery() throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("user");
        request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
        System.out.println(response.getHits().getTotalHits());
        for (SearchHit hit : response.getHits().getHits()) {
            System.out.println(hit.getSourceAsMap());
        }
        esClient.close();
    }

    @Test //做匹配查询 根据年龄查询数据
    public void ESTestDocQueryByCondition() throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("user");
        request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("age", 23)));
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
        System.out.println(response.getHits());  //org.elasticsearch.search.SearchHits@3d65eee0
        System.out.println(response.getTook()); //3ms
        for (SearchHit hit : response.getHits()) {
            System.out.println(hit.getSourceAsMap()); //{name=张三, id=1, age=23, email=null}
        }
        esClient.close();
    }

    @Test //分页查询,查看第几页(页码-1)*每页条数
    public void ESTestDocQueryByPage() throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("user");
        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        builder.from(0);
        builder.size(2);
        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
        System.out.println(response.getHits().getTotalHits()); //5
        System.out.println(response.getTook()); //2ms
        for (SearchHit hit : response.getHits()) {
            System.out.println(hit.getSourceAsMap()); //{name=周七, id=5, age=27, email=null}   {name=李四, id=2, age=24, email=null}
        }
        esClient.close();
    }

    @Test //排序查询
    public void ESTestDocQueryBySort() throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("user");
        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        builder.sort("age", SortOrder.DESC);
        request.source(builder);

        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
        System.out.println(response.getHits().getTotalHits()); //5
        System.out.println(response.getTook()); //8ms
        for (SearchHit hit : response.getHits()) {
            System.out.println(hit.getSourceAsMap());
        }
        /**
         * {name=周七, id=5, age=27, email=null}
         * {name=赵六, id=4, age=26, email=null}
         * {name=王五, id=3, age=25, email=null}
         * {name=李四, id=2, age=24, email=null}
         * {name=张三, id=1, age=23, email=null}
         */
        esClient.close();
    }

    @Test //过滤字段查询
    public void ESTestDocQueryByFilter() throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("user");
        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        String[] excludes = {"email","id"};
        String[] includes={};
        builder.fetchSource(includes,excludes);
        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
        System.out.println(response.getHits().getTotalHits()); //5
        System.out.println(response.getTook()); //2ms
        for (SearchHit hit : response.getHits()) {
            System.out.println(hit.getSourceAsMap());
            /**
             * {name=周七, age=27}
             * {name=李四, age=24}
             * {name=赵六, age=26}
             * {name=张三, age=23}
             * {name=王五, age=25}
             */
        }
        esClient.close();
    }

    @Test //组合查询
    public void ESTestDocQueryByCombination() throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("user");
        SearchSourceBuilder builder = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.should(QueryBuilders.matchQuery("age",24));
        boolQueryBuilder.should(QueryBuilders.matchQuery("name","张三"));
        builder.query(boolQueryBuilder);
        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
        System.out.println(response.getHits().getTotalHits()); //2
        System.out.println(response.getTook()); //3ms
        for (SearchHit hit : response.getHits()) {
            System.out.println(hit.getSourceAsMap());
            /**
             * {name=李四, id=2, age=24, email=null}
             * {name=张三, id=1, age=23, email=null}
             */
        }
        esClient.close();
    }

    @Test //范围查询
    public void ESTestDocQueryByRange() throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("user");
        SearchSourceBuilder builder = new SearchSourceBuilder();
        RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
        rangeQueryBuilder.gte(23);
        rangeQueryBuilder.lt(26);
        builder.query(rangeQueryBuilder);
        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
        System.out.println(response.getHits().getTotalHits()); //3
        System.out.println(response.getTook()); //2ms
        for (SearchHit hit : response.getHits()) {
            System.out.println(hit.getSourceAsMap());
            /**
             * {name=李四, id=2, age=24, email=null}
             * {name=张三, id=1, age=23, email=null}
             * {name=王五, id=3, age=25, email=null}
             */
        }
        esClient.close();
    }

    @Test //模糊查询
    public void ESTestDocQueryByVague() throws IOException {
        SearchRequest request = new SearchRequest();
        request.indices("user");
        SearchSourceBuilder builder = new SearchSourceBuilder();
        builder.query(QueryBuilders.fuzzyQuery("name","小张").fuzziness(Fuzziness.ONE));
        request.source(builder);
        SearchResponse response = esClient.search(request, RequestOptions.DEFAULT);
        System.out.println(response.getHits().getTotalHits()); //1
        System.out.println(response.getTook()); //50ms
        for (SearchHit hit : response.getHits()) {
            System.out.println(hit.getSourceAsMap());
            //{name=张三, id=1, age=23, email=null}
        }
        esClient.close();
    }

}

### Django ORM 中 `class Meta` 选项及其用途 在定义模型时,Django 提供了一个名为 `Meta` 的内部类来指定各种元数据。这些元数据可以控制模型的行为以及其数据库表结构。 #### 基本属性设置 - **ordering**: 定义默认排序字段列表。这会影响查询结果集中的记录顺序。 ```python class Entry(models.Model): title = models.CharField(max_length=255) class Meta: ordering = ['title'] ``` - **verbose_name** 和 **verbose_name_plural**: 设置单数和复数形式的人性化名称,在管理界面显示更友好。 ```python class Book(models.Model): name = models.CharField(max_length=100) class Meta: verbose_name = "book" verbose_name_plural = "books" ``` #### 数据库行为配置 - **db_table**: 显式指明要使用的数据库表名,默认情况下会自动生成基于应用标签和小写的类名组合而成的名字。 ```python class MyModel(models.Model): class Meta: db_table = 'my_custom_table' ``` - **unique_together**: 确保多个字段联合唯一约束,防止重复条目被插入到数据库中。 ```python class Person(models.Model): first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) class Meta: unique_together = [['first_name', 'last_name']] ``` - **index_together**: 创建复合索引来提高特定查询模式下的性能。 ```python class Article(models.Model): pub_date = models.DateField() headline = models.CharField(max_length=100) class Meta: index_together = [ ["pub_date", "headline"], ] ``` #### 权限设定 通过 `permissions` 可以为该模型添加额外权限: ```python from django.db import models class CustomPermissionModel(models.Model): content = models.TextField() class Meta: permissions = ( ("can_view_content", "Can view the special content"), ) ``` 以上就是一些常见的 `class Meta` 配置项[^1]。利用好这些选项可以帮助开发者更好地管理和优化应用程序的数据层逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值