ES(笔记)

es就是json请求体代替字符串查询

dsl查询和过滤,一个模糊查询,一个非模糊查询

must,should 做模糊查询的,里面都是match,根据查询内容进行匹配,filter过滤,term词元查询,就是等值查询。range

  • query : 查询,所有的查询条件在query里面

  • bool : 组合搜索bool可以组合多个查询条件为一个查询对象,这里包含了 DSL查询和DSL过滤的条件

  • must : 必须匹配 :与(must) 或(should) 非(must_not)

  • match:分词匹配查询,会对查询条件分词 , multi_match :多字段匹配

  • filter: 过滤条件

  • term:词元查询,不会对查询条件分词

  • from,size :分页

  • _source :查询结果中需要哪些列

  • sort:排序

分词器:

什么叫分词,在全文检索的理论中,通过关键字查询文档索引进行匹配

倒排索引,正派索引

正排索引,就是一个一个匹配,然后赛选数据。

倒排索引:根据分词器进行分词,语义转换,排序,分组操作生成词元,词元对应文档id

操作es,首先要获取客户端,所以我们要工具类,拿到客户端。

es为什么查询快,因为基于倒排索引,然后就问你倒排索引,非常热点的面试题。

分词器作用

数据的查询是否精准和分词器有很大关系,它默认是英文的分词器

中文的分词器

IK分词器

ES对中文做分词器,默认是英文分词器,10年了还是IK分词器。

要写上,anlyzer:"ik smart"

ik 分词器中有个config文件夹,加上自己想要分词的词语即可。

解压后放到Es插件中

mappering 映射 都是自动给我们创建的,有默认mappering

给的什么数据,就自动解析,默认映射类型。

详细映射写法

analyzer 索引分词器,索引创建时使用的分词器

search_analyzer: 搜索改字段的值,传入的查询内容的分词器。

多字段索引:当对该字段需要使用多种索引模式时使用。如:城市搜索 New York"city":"city":{ "type": "text", "analyzer": "ik_smart", "fields": { "raw": { "type": "keyword" } } } 解释:相当于给 city取了一个别名 city.raw,city的类型为text , city.raw的类型keyword 搜索 city分词 ; 搜索city.raw 不分词那么以后搜索过滤和排序就可以使用city.raw字段名 |

相当于又是text又是keyword?

排序不分词,相当于多了个别名。

默认文档映射

复制代码
public class ESClientUtil {

    public static TransportClient getClient(){
        TransportClient client = null;
        Settings settings = Settings.builder()
                .put("cluster.name", "elasticsearch").build();
        try {
            client = new PreBuiltTransportClient(settings)
                    .addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        return client;
    }

}

API结合Es

简单的增删改查,就不讲了吧,大概流程都是差不多,都是获取的客户端.方法,增删改查的。

先批量插入100条数据,做测试用的

java 复制代码
    @Test
    public void test4(){
//        批量新增100次
        TransportClient client = esClientUtil.getClient();
        BulkRequestBuilder bulkRequestBuilder = client.prepareBulk("shopcar99", "user");
        for (int i = 0; i < 100; i++) {
            IndexRequestBuilder indexRequestBuilder = client.prepareIndex("shopcar99", "user", i + "");
            HashMap<String, Object> map = new HashMap<>();
            map.put("id",i);
            map.put("name","zhang"+i);
            map.put("sex",i%2==0?"n":"nv");
            map.put("age",26+i);
            map.put("intro",i+"qweqeq");
            indexRequestBuilder.setSource(map);
            bulkRequestBuilder.add(indexRequestBuilder);
        }
        BulkResponse bulkItemResponses = bulkRequestBuilder.get();
        System.out.println(bulkItemResponses);
    }

DSL查询+DSL过滤

主要的层级关系

复制代码
query -> bool -> must -> match

先去那query,再去拿bool,分词是must-》match

复制代码
filter->range

把层级理清楚了,代码就懂了。

java 复制代码
    @Test
    public void test5(){
        TransportClient client = esClientUtil.getClient();
        SearchRequestBuilder requestBuilder = client.prepareSearch("shopcar99");
        SearchRequestBuilder user = requestBuilder.setTypes("user");
//        3分页查询,排序,指定查询字段,查询条件
//        分页
        requestBuilder.setFrom(0);
        requestBuilder.setSize(10);
//        paixu
        requestBuilder.addSort("age",SortOrder.ASC);
//        第一个字段叫做包含的 会查出第一个参数中设置的字段
//        第二个参数 exclude 排除  就是排除掉第二个参数中的字段,其他字段全部都要查出来。
        String [] include = {"id","name","age","sex","intro"};
        requestBuilder.setFetchSource(include,null);
//        为什么要用bool,
//        query -> bool -> must -> match
//        bool,直接拿到bool那个层级
//        分词区间等级查询,must->match
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        List<QueryBuilder> must = boolQuery.must();
//        模糊查询
//        must.add(QueryBuilders.matchQuery("intro","1"));
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("intro", "qweqeq");
        must.add(matchQueryBuilder);
//        bool->filter->range
        List<QueryBuilder> filter = boolQuery.filter();
        QueryBuilders.rangeQuery("age").gte(30).lte(70);

//等值查询
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("sex", "n");
        filter.add(termQueryBuilder);
        requestBuilder.setQuery(boolQuery);
        SearchResponse searchResponse = requestBuilder.get();
        SearchHits hits = searchResponse.getHits();
        System.out.println(hits.getTotalHits());
        SearchHit[] hits1 = hits.getHits();
//        hits里面还有hits,这里面就是数据
        for (SearchHit documentFields : hits1) {
            System.out.println(documentFields.getSourceAsMap());

        }
        client.close();


    }
相关推荐
2601_95998624几秒前
M4Markets:把信息透明度做到位——路径分析与提示整理
大数据·人工智能
很楠爱上14 分钟前
Node.js 模块化学习笔记
笔记·学习·node.js
追巨14 分钟前
单节点elasticsearch安装笔记
大数据·elasticsearch·jenkins
夜郎king20 分钟前
告别低效单篇创作,CSDN AI 批量生成工具深度体验
大数据·人工智能·csdn ai 数字营销
鱼锦0.022 分钟前
Coreseek和Elasticsearch 有什么区别
大数据·elasticsearch·jenkins
mnasd23 分钟前
RockyLinux 9.5 部署 Kubernetes1.35 集群
笔记
王莎莎-MinerU37 分钟前
Agent 时代,科学数据 API 需要重新设计
大数据·前端·数据库·人工智能·个人开发
不做无法实现的梦~41 分钟前
Git Clone 使用 Watt/Steam++ 加速时报证书错误的原因与解决方法
大数据·git·elasticsearch
智塑未来42 分钟前
如何选择RFID软硬件系统供应商:采购决策的关键判断维度
大数据·人工智能
東隅已逝,桑榆非晚44 分钟前
编译和链接
c语言·笔记