• ElasticSerach基础语法


    一、常用查询关键字

    1. match 查询

    match查询会将搜索词分词,再与目标查询字段进行匹配,若分词中的任意一个词与目标字段匹配上,则可查询到。

    { "match": { "name": "南山" }}              
    
    QueryBuilders.matchQuery("name", "南山")                 #java代码
    
    • 1
    • 2
    • 3

    2.match_phrase

    默认使用 match_phrase 时会精确匹配查询的短语,需要全部单词和顺序要完全一样,标点符号除外。

    {"query":{"match_phrase":{"sign": "好烦恼"}}}
    
    QueryBuilders.matchPhraseQuery(“sign”,"好烦恼")
    
    • 1
    • 2
    • 3

    3.match_phrase_prefix

    match_phrase_prefix 和 match_phrase 用法是一样的,区别就在于它允许对最后一个词条前缀匹配。

    {"query":{"match_phrase_prefix":{"sign": "我就"}}}
    
    QueryBuilders.matchPhrasePrefixQuery("sign","我就")
    
    • 1
    • 2
    • 3
    1. multi_match 查询

    multi_match 查询可以在多个字段上执行相同的 match 查询

    {
    
        "multi_match": {
    
            "query":    "full text search",
    
            "fields":   [ "title", "body" ]
    
        }
    
    }
    //前一个参数为要查询的数据,后面的为属性名
    QueryBuilders.multiMatchQuery("full text search","body","title"); 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    5.range 查询

    range 查询找出那些落在指定区间内的数字或者时间:

    {
    
        "range": {
    
            "age": {
    
                "gte":  20,                    #gt  大于     gte  大于等于
    
                "lt":   30                        #lt  小于     lte   小于等于
    
            }
    
        }
    
    }
    
    QueryBuilders.rangeQuery("age").gte(20).lt(30)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    6.term 查询

    term 查询被用于精确值匹配,这些精确值可能是数字、时间、布尔或者那些 not_analyzed 的字符串:

    { "term": { "age":26}}
    
    { "term": {"date":"2014-09-01"}}
    
    { "term": { "sign": "英雄"}}
    
    { "term": { "tag": "full_text"}}
    
    QueryBuilders.termQuery("sign", "英雄")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    7.terms 查询

    terms 查询和 term 查询一样,但它允许你指定多值进行匹配。如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件:

    { "terms": { "tag": [ "search", "full_text", "nosql" ] }}
    
    QueryBuilders.termsQuery("sign","英雄","烦恼");
    
    • 1
    • 2
    • 3

    8.exists 查询和 missing 查询

    exists 查询和 missing 查询被用于查找那些指定字段中有值 (exists) 或无值 (missing) 的文档。这与SQL中的 IS_NULL (missing) 和 NOT IS_NULL (exists) 在本质上具有共性:

    {"exists": {"field": "title"}}
    
    QueryBuilders.existsQuery("title");
    
    
    • 1
    • 2
    • 3
    • 4

    9.fuzzy 模糊查询(需要给字段添加分词,不然可能不生效)

    {  "query": {"match": {"content": {"query": "elastoc","fuzziness": "auto"}}}}
    
    QueryBuilders.fuzzyQuery("name", "三");
    
    • 1
    • 2
    • 3

    二、组合多查询

    bool (布尔)过滤器。 这是个 复合过滤器(compound filter) ,它可以接受多个其他过滤器作为参数,并将这些过滤器结合成各式各样的布尔(逻辑)组合。

    1.must

    文档 必须must 匹配这些条件才能被包含进来,与 AND 等价。

    BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
    
    queryBuilder.must(QueryBuilders.termQuery("sign", "英雄"))
    
    • 1
    • 2
    • 3

    2.must_not

    文档 必须不 must_not 匹配这些条件才能被包含进来,与 NOT 等价。

    BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
    
    queryBuilder.mustNot(QueryBuilders.termQuery("sign", "英雄"))
    
    • 1
    • 2
    • 3

    3.should

    至少有一个语句要匹配,与 OR 等价

    BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
    
    queryBuilder.should(QueryBuilders.termQuery("sign", "英雄"))
    
    • 1
    • 2
    • 3

    4.filter

    必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。

    BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
    
    queryBuilder.filter(QueryBuilders.termQuery("sign", "英雄"))
    
    
    • 1
    • 2
    • 3
    • 4

    基础参考

    三、高级查询

    (1)统计某个字段的数量count

    ValueCountBuilder vcb= AggregationBuilders.count("count_uid").field("uid");
    
    • 1

    (2)去重统计某个字段的数量(有少量误差)cardinality

    CardinalityBuilder cb= AggregationBuilders.cardinality("distinct_count_uid").field("uid");
    
    • 1

    (3)聚合过滤filter

    FilterAggregationBuilder fab= AggregationBuilders.filter("uid_filter").filter(QueryBuilders.queryStringQuery("uid:001"));
    
    
    • 1
    • 2

    (4)按某个字段分组filter

    TermsBuilder tb= AggregationBuilders.terms("group_name").field("name");
    
    
    • 1
    • 2

    (5)求和sum

    
    SumBuilder sumBuilder= AggregationBuilders.sum("sum_price").field("price");
    
    • 1
    • 2

    (6)求平均avg

    
    AvgBuilder ab= AggregationBuilders.avg("avg_price").field("price");
    
    
    • 1
    • 2
    • 3

    (7)求最大值max

    
    MaxBuilder mb= AggregationBuilders.max("max_price").field("price");
    
    
    • 1
    • 2
    • 3

    (8)求最小值min

    MinBuilder min= AggregationBuilders.min("min_price").field("price");
    
    • 1

    (9)按日期间隔分组dateHistogram

    DateHistogramBuilder dhb= AggregationBuilders.dateHistogram("dh").field("date");
    
    
    • 1
    • 2

    (10)获取聚合里面的结果topHits

    TopHitsBuilder thb= AggregationBuilders.topHits("top_result");
    
    • 1

    (11)嵌套的聚合nested

    NestedBuilder nb= AggregationBuilders.nested("negsted_path").path("quests");
    
    
    • 1
    • 2

    (12)反转嵌套reverseNested

    AggregationBuilders.reverseNested("res_negsted").path("kps ");
    
    • 1

    聚合参考
    https://blog.csdn.net/u012998680/article/details/120023384

    实际使用参考
    https://editor.csdn.net/md/?articleId=128201878

  • 相关阅读:
    vulnhub靶场之WORST WESTERN HOTEL: 1
    书生大模型实战营第四期-入门岛第一关
    SQLite 安装和 Java 使用教程
    2022 年首届钉钉杯大学生大数据挑战赛初赛的Baseline
    【js】-【贪心算法】-笔记
    JAVA毕业设计扶贫产品销售计算机源码+lw文档+系统+调试部署+数据库
    @staticmethod
    服装行业在快手打广告效果好吗?如何在短视频平台推广服装?
    动态规划解决leetcode上的两道回文问题(针对思路)
    【手写协程】带你从底层实现一个最小协程调度器
  • 原文地址:https://blog.csdn.net/qq_20057315/article/details/128201974