• delete-by-query和复合查询


    根据term,match等查询方式去删除大量的文档

    Ps:如果你需要删除的内容,是index下的大部分数据,推荐创建一个全新的index,将保留的文档内容,添加到全新的索引

    1. # delete-by-query
    2. POST /sms-logs-index/sms-logs-type/_delete_by_query
    3. {
    4. "query": {
    5. "range": {
    6. "fee": {
    7. "lt": 4
    8. }
    9. }
    10. }
    11. }

     

    1. // Java代码实现
    2. @Test
    3. public void deleteByQuery() throws IOException {
    4. //1. 创建DeleteByQueryRequest
    5. DeleteByQueryRequest request = new DeleteByQueryRequest(index);
    6. request.types(type);
    7. //2. 指定检索的条件 和SearchRequest指定Query的方式不一样
    8. request.setQuery(QueryBuilders.rangeQuery("fee").lt(4));
    9. //3. 执行删除
    10. BulkByScrollResponse resp = client.deleteByQuery(request, RequestOptions.DEFAULT);
    11. //4. 输出返回结果
    12. System.out.println(resp.toString());
    13. }

    复合查询

    bool查询

    复合过滤器,将你的多个查询条件,以一定的逻辑组合在一起。

    • must: 所有的条件,用must组合在一起,表示And的意思

    • must_not:将must_not中的条件,全部都不能匹配,标识Not的意思

    • should:所有的条件,用should组合在一起,表示Or的意思

    1. # 查询省份为武汉或者北京
    2. # 运营商不是联通
    3. # smsContent中包含中国和平安
    4. # bool查询
    5. POST /sms-logs-index/sms-logs-type/_search
    6. {
    7. "query": {
    8. "bool": {
    9. "should": [
    10. {
    11. "term": {
    12. "province": {
    13. "value": "北京"
    14. }
    15. }
    16. },
    17. {
    18. "term": {
    19. "province": {
    20. "value": "武汉"
    21. }
    22. }
    23. }
    24. ],
    25. "must_not": [
    26. {
    27. "term": {
    28. "operatorId": {
    29. "value": "2"
    30. }
    31. }
    32. }
    33. ],
    34. "must": [
    35. {
    36. "match": {
    37. "smsContent": "中国"
    38. }
    39. },
    40. {
    41. "match": {
    42. "smsContent": "平安"
    43. }
    44. }
    45. ]
    46. }
    47. }
    48. }

     

    1. // Java代码实现Bool查询
    2. @Test
    3. public void BoolQuery() throws IOException {
    4. //1. 创建SearchRequest
    5. SearchRequest request = new SearchRequest(index);
    6. request.types(type);
    7. //2. 指定查询条件
    8. SearchSourceBuilder builder = new SearchSourceBuilder();
    9. BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
    10. // # 查询省份为武汉或者北京
    11. boolQuery.should(QueryBuilders.termQuery("province","武汉"));
    12. boolQuery.should(QueryBuilders.termQuery("province","北京"));
    13. // # 运营商不是联通
    14. boolQuery.mustNot(QueryBuilders.termQuery("operatorId",2));
    15. // # smsContent中包含中国和平安
    16. boolQuery.must(QueryBuilders.matchQuery("smsContent","中国"));
    17. boolQuery.must(QueryBuilders.matchQuery("smsContent","平安"));
    18. builder.query(boolQuery);
    19. request.source(builder);
    20. //3. 执行查询
    21. SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
    22. //4. 输出结果
    23. for (SearchHit hit : resp.getHits().getHits()) {
    24. System.out.println(hit.getSourceAsMap());
    25. }
    26. }

    boosting查询

    boosting查询可以帮助我们去影响查询后的score。

    • positive:只有匹配上positive的查询的内容,才会被放到返回的结果集中。

    • negative:如果匹配上和positive并且也匹配上了negative,就可以降低这样的文档score。

    • negative_boost:指定系数,必须小于1.0

    关于查询时,分数是如何计算的:

    • 搜索的关键字在文档中出现的频次越高,分数就越高

    • 指定的文档内容越短,分数就越高

    • 我们在搜索时,指定的关键字也会被分词,这个被分词的内容,被分词库匹配的个数越多,分数越高

     原本10分,negative了,就成了3分

     

    1. # boosting查询 收货安装
    2. POST /sms-logs-index/sms-logs-type/_search
    3. {
    4. "query": {
    5. "boosting": {
    6. "positive": {
    7. "match": {
    8. "smsContent": "收货安装"
    9. }
    10. },
    11. "negative": {
    12. "match": {
    13. "smsContent": "王五"
    14. }
    15. },
    16. "negative_boost": 0.5
    17. }
    18. }
    19. }
    1. // Java实现Boosting查询
    2. @Test
    3. public void BoostingQuery() throws IOException {
    4. //1. 创建SearchRequest
    5. SearchRequest request = new SearchRequest(index);
    6. request.types(type);
    7. //2. 指定查询条件
    8. SearchSourceBuilder builder = new SearchSourceBuilder();
    9. BoostingQueryBuilder boostingQuery = QueryBuilders.boostingQuery(
    10. QueryBuilders.matchQuery("smsContent", "收货安装"),
    11. QueryBuilders.matchQuery("smsContent", "王五")
    12. ).negativeBoost(0.5f);
    13. builder.query(boostingQuery);
    14. request.source(builder);
    15. //3. 执行查询
    16. SearchResponse resp = client.search(request, RequestOptions.DEFAULT);
    17. //4. 输出结果
    18. for (SearchHit hit : resp.getHits().getHits()) {
    19. System.out.println(hit.getSourceAsMap());
    20. }
    21. }

  • 相关阅读:
    问题记录 MLNX_OFED_LINUX-5.4-3.6.8.1-ubuntu20.04-x86_64安装mlnx-ofed-kernel-dkms错误
    Python sort 自定义函数排序
    超级简单学会:盐加密&Shiro认证
    驱动开发--字符设备驱动的实现
    java基础运算符 之 赋值运算符
    详细介绍如何微调 YOLOv8 姿势模型以进行动物姿势估计--附完整源码
    地图结构 | 图解维诺图Voronoi原理(附C++/Python/Matlab仿真)
    橘子学MQ之rocketmq
    小程序对接停车场支付流程思考
    JS语言里常见的随机函数示例,实验结果分布规律分析
  • 原文地址:https://blog.csdn.net/weixin_60934893/article/details/128047181