ElasticSearch(狂神说笔记)

1.是什么?

倒排索引

2.哪里下?

elasticsearch,kinaba:
https://www.elastic.co/cn/elasticsearch/
elasticsearch-head-master:
https://github.com/mobz/elasticsearch-head
ik分词器
https://github.com/medcl/elasticsearch-analysis-ik/releases

//帮助文档
https://www.elastic.co/guide/index.html

3.怎么用?

kinaba设置中文
在这里插入图片描述

elasticsearch
#跨域配置:
http.cors.enabled: true
http.cors.allow-origin: "*"

在这里插入图片描述

ik分词器用法
解压到plugins目录下
在这里插入图片描述

ik目录下可配置自己的字典
在这里插入图片描述

  1. 新建my.dic文件

  2. 文件里输入自定义词汇在这里插入图片描述

  3. 配置文件里加载my.dic在这里插入图片描述

  4. 重启ElasticSearch在这里插入图片描述

  5. 最小拆分和最细粒度拆分在这里插入图片描述

在这里插入图片描述

查询
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
keyword和text区别
keyword类型是一个整体,text会被分词

在这里插入图片描述
在这里插入图片描述

API调用

package com.es;

import com.alibaba.fastjson.JSON;
import com.es.pojo.User;
import com.es.util.Es;
import org.apache.lucene.util.QueryBuilder;
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.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.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;

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

@SpringBootTest
class DemoApplicationTests {
    @Autowired
    @Qualifier("RestHighLevelClient")
    private RestHighLevelClient client;

    //创建索引
    @Test
    void contextLoads() throws IOException {
        CreateIndexRequest index = new CreateIndexRequest("kun_index");
        CreateIndexResponse createIndexResponse = client.indices().create(index, RequestOptions.DEFAULT);
        System.out.println(createIndexResponse.isAcknowledged());
    }

    //索引是否存在
    @Test
    void test02() throws IOException {
        GetIndexRequest index = new GetIndexRequest("kun_index");
        boolean exists = client.indices().exists(index, RequestOptions.DEFAULT);
        System.out.println(exists);
    }

    //删除索引
    @Test
    void test03() throws IOException {
        DeleteIndexRequest kun_index = new DeleteIndexRequest("kun_index");
        AcknowledgedResponse delete = client.indices().delete(kun_index, RequestOptions.DEFAULT);
        System.out.println(delete.isAcknowledged());
    }

    //创建文档
    @Test
    void test04() throws IOException {
        User user = new User( "kun", "kun desc");
        IndexRequest req = new IndexRequest("kun_index");
        req.id("1");
        req.source(JSON.toJSONString(user), XContentType.JSON);
        IndexResponse index = client.index(req, RequestOptions.DEFAULT);
        System.out.println(index);
        System.out.println(index.status());
    }


    //查看文档是否存在
    @Test
    void test05() throws IOException {
        GetRequest req = new GetRequest("kun_index", "1");
        //不获取_source的上下文
        req.fetchSourceContext(new FetchSourceContext(false));
        req.storedFields("_none_");

        boolean exists = client.exists(req, RequestOptions.DEFAULT);
        System.out.println(exists);
    }
    //查看文档信息
    @Test
    void test06() throws IOException {
        GetRequest req = new GetRequest("kun_index", "1");
        GetResponse document = client.get(req, RequestOptions.DEFAULT);
        System.out.println(document.getSource());
        System.out.println(document.getId());
        System.out.println(document.getSourceAsMap());
    }

    //更新文档信息
    @Test
    void test07() throws IOException {
        UpdateRequest req = new UpdateRequest("kun_index","1");
        User user = new User("kun_update", "kun_desc_update");
        req.doc(JSON.toJSONString(user),XContentType.JSON);
        req.timeout(TimeValue.timeValueSeconds(1));

        UpdateResponse update = client.update(req, RequestOptions.DEFAULT);
        System.out.println(update.status());
    }

    //删除文档信息
    @Test
    void test08() throws IOException {
        DeleteRequest req = new DeleteRequest("kun_index", "1");
        req.timeout("1s");

        DeleteResponse delete = client.delete(req, RequestOptions.DEFAULT);
        System.out.println(delete.status());
    }

    @Test
    void test09() throws IOException {
        BulkRequest bulk = new BulkRequest("kun_index");
        ArrayList<User> arr = new ArrayList<>();
        arr.add(new User("kun01","desc"));
        arr.add(new User("kun02","desc"));
        arr.add(new User("kun03","desc"));
        arr.add(new User("kun04","desc"));
        arr.add(new User("kun05","desc"));
        arr.add(new User("kun06","desc"));

        for (int i=1;i<arr.size();i++){
            bulk.add(new IndexRequest("kun_index")
                    .id(i+"") //指定id,不加是随机id
                    .source(JSON.toJSONString(arr.get(i-1)),XContentType.JSON));
        }

        BulkResponse cliBlk = client.bulk(bulk, RequestOptions.DEFAULT);
        System.out.println(cliBlk.hasFailures());//是否失败,false代表成功

    }

    @Test
    void test10() throws IOException {
        SearchRequest searchRequest = new SearchRequest(Es.es_index);
        //构建搜索条件
        SearchSourceBuilder builder = new SearchSourceBuilder();
        //builder.highlighter();//高亮
        //QueryBuilders.termQuery精确查找
        //QueryBuilders.matchAllQuery()匹配所有

        //分页
        builder.from(0);
        builder.size(10);

        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "kun01");
        builder.query(termQueryBuilder);
        builder.timeout(new TimeValue(60,TimeUnit.SECONDS));

        searchRequest.source(builder);

        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        System.out.println(search);
        System.out.println(search.getHits());
        System.out.println("====================");
        for (SearchHit s:search.getHits().getHits()){
            System.out.println(s.getSourceAsMap());
        }

    }
}

高亮展示

package com.example.demo02.servlet;

import com.alibaba.fastjson.JSON;
import com.example.demo02.pojo.Content;
import com.example.demo02.util.JsoupUtil;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class ContentServlet {

    @Autowired
    @Qualifier("RestHighLevelClient")
    private RestHighLevelClient client;
    
    public boolean add(String keyword) throws IOException {
        BulkRequest bulk = new BulkRequest("kun_index");
        bulk.timeout("2m");
        final List<Content> arr = JsoupUtil.getJsoupData(keyword);

        for (int i=1;i<arr.size();i++){
            bulk.add(new IndexRequest("jd_goods")
                    .id(i+"") //指定id,不加是随机id
                    .source(JSON.toJSONString(arr.get(i-1)), XContentType.JSON));
        }

        BulkResponse cliBlk = client.bulk(bulk, RequestOptions.DEFAULT);
        return !cliBlk.hasFailures();//是否失败,false代表成功
    }

    public List<Map> search(String keyword, int pageNo, int pageSize) throws IOException {
        SearchRequest searchRequest = new SearchRequest("jd_goods");
        SearchSourceBuilder builder = new SearchSourceBuilder();

        //分页
        builder.from(pageNo);
        builder.size(pageSize);


        builder.timeout(new TimeValue(60, TimeUnit.SECONDS));
//        TermQueryBuilder title = QueryBuilders.termQuery("title", keyword);
        //多个高亮显示
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.should(QueryBuilders.matchQuery("title",keyword));
        boolQueryBuilder.should(QueryBuilders.matchQuery("price","java124"));

        builder.query(boolQueryBuilder);

        //设置高亮
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.requireFieldMatch(true);//多个高亮显示
        highlightBuilder.field("title").field("price").preTags("<span style='color:red'>").postTags("</span>");

        builder.highlighter(highlightBuilder);


        searchRequest.source(builder);

        SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
        ArrayList<Map> list = new ArrayList<>();
        for(SearchHit s:search.getHits().getHits()){
            //------------------------------------------
            Map<String, HighlightField> highlightFields = s.getHighlightFields();
            HighlightField titleH = highlightFields.get("title");
            HighlightField priceH = highlightFields.get("price");

            Map<String, Object> sourceAsMap = s.getSourceAsMap();//原来的结果
            if(titleH!=null){
                Text[] fragments = titleH.fragments();
                String n_title="";
                for(Text text:fragments){
                    n_title+=text;
                }
                //高亮字段替换原来字段
                sourceAsMap.put("title",n_title);
            }

            if(priceH!=null){
                Text[] fragments = priceH.fragments();
                String n_price="";
                for(Text text:fragments){
                    n_price+=text;
                }
                //高亮字段替换原来字段
                sourceAsMap.put("price",n_price);
            }
            

            //------------------------------------------

            list.add(s.getSourceAsMap());
        }

        return list;
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值