ElasticSearch

官网

https://www.elastic.co/cn/products/elasticsearch

优点

1.扩展性好,可部署上百台服务器集群,处理PB级数据 。B KB MB  GB TB  PB ZB

2.近实时的去索引数据、搜索数据。

 索引结构

下图是ElasticSearch的索引结构,下边黑色部分是物理结构,上边黄色部分是逻辑结构,逻辑结构也是为了更好的去描述ElasticSearch的工作原理及去使用物理结构中的索引文件。

逻辑结构部分是一个倒排索引表:

1、将要搜索的文档内容分词,所有不重复的词组成分词列表。

2、将搜索的文档最终以Document方式存储起来。

3、每个词和docment都有关联。

安装

bin:脚本目录,包括:启动、停止等可执行脚本

config:配置文件目录

data:索引目录,存放索引文件的地方

logs:日志目录

modules:模块目录,包括了es的功能模块

plugins :插件目录,es支持插件机制

配置文件

ES的配置文件的地址根据安装形式的不同而不同:

使用ziptar安装,配置文件的地址在安装目录的confifig下。

使用RPM安装,配置文件在/etc/elasticsearch下。

使用MSI安装,配置文件的地址在安装目录的confifig下,并且会自动将confifig目录地址写入环境变量 ES_PATH_CONF

本教程使用的zip包安装,配置文件在ES安装目录的confifig下。

配置文件如下:

elasticsearch.yml : 用于配置Elasticsearch运行参数 jvm.options : 用于配置Elasticsearch JVM设置

log4j2.properties: 用于配置Elasticsearch日志

elasticsearch.yml

配置格式是YAML,可以采用如下两种方式:

方式1:层次方式

path: data: /var/lib/elasticsearch logs: /var/log/elasticsearch

方式2:属性方式

path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch

本项目采用方式2,例子如下:

cluster.name: xuecheng

node.name: xc_node_1

network.host: 0.0.0.0

http.port: 9200

transport.tcp.port: 9300

node.master: true

node.data: true

#discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301", "0.0.0.0:9302"]

discovery.zen.minimum_master_nodes: 1

bootstrap.memory_lock: false

node.max_local_storage_nodes: 1

path.data: D:\ElasticSearch\elasticsearch‐6.2.1\data

path.logs: D:\ElasticSearch\elasticsearch‐6.2.1\logs

http.cors.enabled: true

http.cors.allow‐origin: /.*/

注意path.datapath.logs路径配置正确。

依赖

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>6.5.4</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>6.5.4</version>
</dependency>

创建索引库

@Override
public void createIndex() throws Exception {
    CreateIndexRequest createIndexRequest = new CreateIndexRequest("tb_sku");
    createIndexRequest.settings(Settings.builder().put("number_of_shards", "1").put("number_of_replicas", "0"));
    createIndexRequest.mapping("doc","{\n" +
                "\t\"properties\": {\n" +
                "\t\t\"id\": {\n" +
                "\t\t\t\"type\": \"text\"\n" +
                "\t\t},\n" +
                "\t\t\"sn\": {\n" +
                "\t\t\t\"type\": \"text\",\n" +
                "            \"analyzer\": \"ik_max_word\",\n" +
                "\t\t\t\"search_analyzer\": \"ik_smart\"\n" +
                "\t\t},\n" +
                "\t\t\"name\": {\n" +
                "\t\t\t\"type\": \"keyword\"\n" +
                "\t\t},\n" +
                "        \"image\":{\n" +
                "            \"type\":\"text\",\n" +
                "            \"index\":false\n" +
                "        }\n" +
                "\t}\n" +
                "}", XContentType.JSON);
    CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
    System.out.println(createIndexResponse.index());
}

全部查询

public void  query1() throws Exception{
        //创建查询请求对象
        SearchRequest searchRequest = new SearchRequest("tb_sku");
        searchRequest.types("doc");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT.DEFAULT);
        SearchHits hits = searchResponse.getHits();
        SearchHit[] searchHits = hits.getHits();
        for (SearchHit hit : searchHits) {
            String id = hit.getId();
            String index = hit.getIndex();
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            System.out.println(sourceAsMap);
        }
    }

分页查询(指定起始位置和数据个数)

        SearchRequest searchRequest = new SearchRequest("tb_sku");
        searchRequest.types("doc");
        //创建查询语句对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(20);
        searchSourceBuilder.query(QueryBuilders.matchAllQuery());
        searchRequest.source(searchSourceBuilder);

精准查询

        SearchRequest searchRequest = new SearchRequest("tb_sku");
        searchRequest.types("doc");
        //创建查询语句对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.termQuery("id","100000006163"));
        searchRequest.source(searchSourceBuilder);

分词查询

        SearchRequest searchRequest = new SearchRequest("tb_sku");
        searchRequest.types("doc");
        //创建查询语句对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchQuery("sn","java开发")
                .operator(Operator.OR).minimumShouldMatch("80%"));
        searchRequest.source(searchSourceBuilder);

多条件查询

SearchRequest searchRequest = new SearchRequest("tb_sku");
        searchRequest.types("doc");
        //创建查询语句对象
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //分词查
        MultiMatchQueryBuilder multiMatchQueryBuilder = new MultiMatchQueryBuilder("java开发","sn");
        //精准查
        TermsQueryBuilder termsQueryBuilder = new TermsQueryBuilder("id","100000006163");
        //创建多条件查询
        BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
        boolQueryBuilder.must(multiMatchQueryBuilder);
        boolQueryBuilder.must(termsQueryBuilder);

        searchSourceBuilder.query(boolQueryBuilder);

        searchRequest.source(searchSourceBuilder);

添加数据到索引库

public void addDoc() throws IOException {
        QueryWrapper<TbSkuModel> queryWrapper = new QueryWrapper<>();
        queryWrapper.last("limit 50");
        List<TbSkuModel> list = tbSkuService.list(queryWrapper);
        Map<String, Object> jsonMap = new HashMap<>();
        IndexResponse indexResponse=null;
        for (TbSkuModel model : list) {
            jsonMap.put("id",model.getId());
            jsonMap.put("image", model.getImage());
            jsonMap.put("name", model.getName());
            jsonMap.put("sn", model.getSn());
            IndexRequest indexRequest = new IndexRequest("tb_sku", "doc");
            indexRequest.source(jsonMap);
            indexResponse = client.index(indexRequest);
        }
        DocWriteResponse.Result result = indexResponse.getResult();
        System.out.println(result);
    }

删除索引库

public void deleteIndex() throws Exception {
        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("tb_sku");
        AcknowledgedResponse acknowledgedResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
        System.out.println(acknowledgedResponse.isAcknowledged());
    }

删除索引库数据

public void deleteDoc() throws Exception {
        DeleteRequest deleteRequest = new DeleteRequest("tb_sku", "doc", "2");
        DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
        System.out.println(deleteResponse.status());
    }

更新索引库数据

public void updateDoc() throws Exception {
        UpdateRequest updateRequest = new UpdateRequest("tb_sku", "doc", "2");
        Map<String, Object> jsonMap = new HashMap<>();
        jsonMap.put("id","qqq");
        jsonMap.put("image", "test11");
        jsonMap.put("name","111");
        jsonMap.put("sn", "1122");
        updateRequest.doc(jsonMap);
        UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT);
        System.out.println(update);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值