• 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?

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

    默认文档映射

    1. public class ESClientUtil {
    2. public static TransportClient getClient(){
    3. TransportClient client = null;
    4. Settings settings = Settings.builder()
    5. .put("cluster.name", "elasticsearch").build();
    6. try {
    7. client = new PreBuiltTransportClient(settings)
    8. .addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
    9. } catch (UnknownHostException e) {
    10. e.printStackTrace();
    11. }
    12. return client;
    13. }
    14. }

    API结合Es

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

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

    1. @Test
    2. public void test4(){
    3. // 批量新增100次
    4. TransportClient client = esClientUtil.getClient();
    5. BulkRequestBuilder bulkRequestBuilder = client.prepareBulk("shopcar99", "user");
    6. for (int i = 0; i < 100; i++) {
    7. IndexRequestBuilder indexRequestBuilder = client.prepareIndex("shopcar99", "user", i + "");
    8. HashMap map = new HashMap<>();
    9. map.put("id",i);
    10. map.put("name","zhang"+i);
    11. map.put("sex",i%2==0?"n":"nv");
    12. map.put("age",26+i);
    13. map.put("intro",i+"qweqeq");
    14. indexRequestBuilder.setSource(map);
    15. bulkRequestBuilder.add(indexRequestBuilder);
    16. }
    17. BulkResponse bulkItemResponses = bulkRequestBuilder.get();
    18. System.out.println(bulkItemResponses);
    19. }

    DSL查询+DSL过滤

    主要的层级关系

    query -> bool -> must -> match

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

    filter->range

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

    1. @Test
    2. public void test5(){
    3. TransportClient client = esClientUtil.getClient();
    4. SearchRequestBuilder requestBuilder = client.prepareSearch("shopcar99");
    5. SearchRequestBuilder user = requestBuilder.setTypes("user");
    6. // 3分页查询,排序,指定查询字段,查询条件
    7. // 分页
    8. requestBuilder.setFrom(0);
    9. requestBuilder.setSize(10);
    10. // paixu
    11. requestBuilder.addSort("age",SortOrder.ASC);
    12. // 第一个字段叫做包含的 会查出第一个参数中设置的字段
    13. // 第二个参数 exclude 排除 就是排除掉第二个参数中的字段,其他字段全部都要查出来。
    14. String [] include = {"id","name","age","sex","intro"};
    15. requestBuilder.setFetchSource(include,null);
    16. // 为什么要用bool,
    17. // query -> bool -> must -> match
    18. // bool,直接拿到bool那个层级
    19. // 分词区间等级查询,must->match
    20. BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
    21. List must = boolQuery.must();
    22. // 模糊查询
    23. // must.add(QueryBuilders.matchQuery("intro","1"));
    24. MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("intro", "qweqeq");
    25. must.add(matchQueryBuilder);
    26. // bool->filter->range
    27. List filter = boolQuery.filter();
    28. QueryBuilders.rangeQuery("age").gte(30).lte(70);
    29. //等值查询
    30. TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("sex", "n");
    31. filter.add(termQueryBuilder);
    32. requestBuilder.setQuery(boolQuery);
    33. SearchResponse searchResponse = requestBuilder.get();
    34. SearchHits hits = searchResponse.getHits();
    35. System.out.println(hits.getTotalHits());
    36. SearchHit[] hits1 = hits.getHits();
    37. // hits里面还有hits,这里面就是数据
    38. for (SearchHit documentFields : hits1) {
    39. System.out.println(documentFields.getSourceAsMap());
    40. }
    41. client.close();
    42. }

  • 相关阅读:
    如何在电脑上玩“胆小菇之梦”
    Spring【注解实现IOC(@Component、@Repository、@Service、@Controller)】(三)-全面详解(学习总结---从入门到深化)
    Qt开发经验小技巧241-245
    搭建深度学习网络时节约GPU显存的技巧
    UG NX二次开发(C#)- 制图(Draft)-工程图框选制图曲线并输出制图曲线的信息
    51单片机学习:I2C-EEPROM实验
    Vue太难啦!从入门到放弃day06——Vue前端路由
    8 张图 | 剖析 Eureka 的首次同步注册表
    二分图匹配(匈牙利算法 DFS 实现)
    vue3源码分析——实现组件更新
  • 原文地址:https://blog.csdn.net/m0_51798113/article/details/139980470