ES 自己做的例子汇总

本文深入探讨Elasticsearch中的复杂查询技术,包括精确日期、多条件组合、特定标签匹配及高级字段权重调整等,旨在帮助读者掌握高效数据检索的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

首先初始化数据

POST /forums/articles/_bulk 
{ "index": { "_id": 1 }}
{ "articleID" : "XHDK-A-1293-#fJ3", "userID" : 1, "hidden": false, "postDate": "2017-01-01" } 
{ "index": { "_id": 2 }}
{ "articleID" : "KDKE-B-9947-#kL5", "userID" : 1, "hidden": false, "postDate": "2017-01-02" } 
{ "index": { "_id": 3 }}
{ "articleID" : "JODL-X-1937-#pV7", "userID" : 2, "hidden": false, "postDate": "2017-01-01" } 
{ "index": { "_id": 4 }}
{ "articleID" : "QQPX-R-3956-#aD8", "userID" : 2, "hidden": true, "postDate": "2017-01-02" } 

POST /forums/articles/_bulk
{ "index": { "_id": 5 }}
{ "articleID" : "XHDK-C-1293-#fJ3", "userID" : 2, "hidden": false, "postDate": "2017-02-01" }
{ "index": { "_id": 6 }}
{ "articleID" : "KDKE-D-9947-#kL5", "userID" : 3, "hidden": false, "postDate": "2017-02-02" }
{ "index": { "_id": 7 }}
{ "articleID" : "JODL-E-1937-#pV7", "userID" : 4, "hidden": false, "postDate": "2017-02-01" }
{ "index": { "_id": 8 }}
{ "articleID" : "QQPX-F-3956-#aD8", "userID" : 5, "hidden": true, "postDate": "2017-03-02" }

POST /forum/article/_bulk
{ "update": { "_id": "1"} }
{ "doc" : {"tag" : ["java", "hadoop"]} }
{ "update": { "_id": "2"} }
{ "doc" : {"tag" : ["java"]} }
{ "update": { "_id": "3"} }
{ "doc" : {"tag" : ["hadoop"]} }
{ "update": { "_id": "4"} }
{ "doc" : {"tag" : ["java", "elasticsearch"]} }
{ "update": { "_id": "5"} }
{ "doc" : {"tag" : ["java", "hadoop"]} }
{ "update": { "_id": "6"} }
{ "doc" : {"tag" : ["java","mysql"]} }
{ "update": { "_id": "7"} }
{ "doc" : {"tag" : ["hadoop"]} }
{ "update": { "_id": "8"} }
{ "doc" : {"tag" : ["java", "elasticsearch","mysql"]} }

第一个简单的查询 查询postDate 在2017-01-01的帖子

GET /forums/articles/_search
{
  "query": {
    "constant_score": {
      "filter": {
          "bool": {
            "must": [
              { "term": {
                "postDate": "2017-01-01"
              } }
            ]
          }
      },
      "boost": 1.2
    }
  }
}

第二个查询,查询查询postDate 在2017-01-01的帖子或者是用户userid=2发的帖子

POST /forums/articles/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "bool": {
          "should": [
            {
              "term": {
                "postDate": "2017-01-01"
              }
            },
            {
              "term": {
                "userID": 2
              }
            }
          ]
        }
      }
    }
  }
}

第三个查询,查询用户userid=2 在2017-01-01和2017-01-01发的帖子

POST /forums/articles/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "bool": {
          "must": {
            "term": {
              "userID": 2
            }
          },
          "should": [
            {
              "term": {
                "postDate": "2017-01-01"
              }
            },
            {
              "term": {
                "postDate": "2017-01-02"
              }
            }
          ]
        }
      }
    }
  }
}

第4个需求  查询tag中包含java和hadoop的文章

POST /forums/articles/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "bool": {
          "must": [
            {
              "terms": {
                "tag": [
                  "java",
                  "hadoop"
                ]
              }
            }
          ]
        }
      }
    }
  }
}

第5个需求,我们要查询tag只是java的数据

这时原有数据如果统计的话比较麻烦,我们更新一下原有数据,添加一个新的字段tag_cnt用来表示tag数量,这样只需要查tag中含有java并且tag_cnt=1的数据即可。

POST /forums/articles/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "bool": {
          "must": [
            {
              "term": {
                "tag_cnt": 1
              }
            },
            {
              "term": {
                "tag": "java"
              }
            }
          ]
        }
      }
    }
  }
}

第6个需求  添加了字段view_cnt用来表示访问次数,查询访问次数在40到80的文章并且发帖日期在2017年2月1日后

 

POST /forums/articles/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "bool": {
          "must": [
            {
              "range": {
                "view_cnt": {
                  "gte": 40,
                  "lte": 80
                }
              }
            },
            {
              "range": {
                "postDate": {
                  "gte": "2017-02-01"
                }
              }
            }
          ]
        }
      }
    }
  }
}
postDate": {
                  "gte": "2017-01-01||+30d"
                }

上面这种是针对日期类型的一种用法。

第7个需求:查询title中多个关键词的情况,比如java hadoop mysql 或者elasticsearch中出现3次的

GET /forums/articles/_search
{
  "query": {
    "bool": {
      "should": [
        {"match": {
          "title": "java"
        }},
        {"match": {
          "title": "elasticsearch"
        }},
        {
          "match": {
            "title": "hadoop"
          }
        },
        {"match": {
          "title": "mysql"
        }}
      ],
        "minimum_should_match": 3
    }
  }
}

boost 可以进行细粒度的权重控制。

muti_query的例子,先更新数据

POST /forums/articles/_bulk
{ "update": { "_id": "1"} }
{ "doc" : {"content" : "i like to write best elasticsearch article"} }
{ "update": { "_id": "2"} }
{ "doc" : {"content" : "i think java is the best programming language"} }
{ "update": { "_id": "3"} }
{ "doc" : {"content" : "i am only an elasticsearch beginner"} }
{ "update": { "_id": "4"} }
{ "doc" : {"content" : "elasticsearch and hadoop are all very good solution, i am a beginner"} }
{ "update": { "_id": "5"} }
{ "doc" : {"content" : "spark is best big data solution based on scala ,an programming language similar to java"} }

按单个字段的结果优先排序

POST /forums/articles/_search
{
  "query": {
    "dis_max": {
      "queries": [
        {
          "match": {
            "title": "java solution"
          }
        },
        {
          "match": {
            "content": "java solution"
          }
        }
      ]
    }
  }
}

加入字段权重 同时加入 tie_breaker进行score分值折中 ,title权重为2

POST /forums/articles/_search
{
  "query": {
    "dis_max": {
      "queries": [
        {
          "match": {
            "title": { "query": "java solution",
            "minimum_should_match": "50%",
            "boost" : 2
            }
            
          }
        },
        {
          "match": {
            "content": "java solution"
          }
        }
      ],
      "tie_breaker": 0.7
    }
  }
}

cross_fields的

POST /forums/articles/_search
{
  "query": {
    "multi_match": {
      "query": "Peter Smith",
      "type": "cross_fields",
      "operator" : "and",
      "fields": [
        "new_author_first_name",
        "new_author_last_name"
      ]
    }
  }
}

 

ES (Elasticsearch) 是由 Elasticsearch 公司提供的开源全文搜索及分析引擎,它基于 Lucene,用于构建高性能、分布式的大数据处理系统。ES 支持实时查询,并能高效地处理大量的日志、事件流和其他实时数据源。下面是一些常用的 ES 查询语句及其解释: ### 1. **基本搜索查询** 基础的全文搜索语句,查找包含指定关键字的所有文档。 ```json GET /index_name/_search { "query": { "match": { "field_name": "keyword" } } } ``` 这里 `index_name` 是索引名称,`field_name` 是需要搜索的字段名,`keyword` 是你要搜索的关键字。 ### 2. **范围查询** 用于查询特定范围内值的记录。 ```json GET /index_name/_search { "query": { "range": { "numeric_field": { "gt": 5, "lt": 10 } } } } ``` 在这个例子中,我们查询 `numeric_field` 字段大于5且小于10的记录。 ### 3. **聚合查询** 聚合查询用于对结果集进行统计汇总。 ```json GET /index_name/_search { "aggs": { "my_aggregation": { "terms": { "field": "category", "size": 10 }, "aggs": { "average_price": { "avg": { "field": "price" } } } } } } ``` 这个查询会将所有文档按照 `category` 字段分组,并计算每个类别下平均价格。 ### 4. **过滤查询** 用于进一步缩小搜索结果的条件筛选。 ```json GET /index_name/_search { "query": { "bool": { "must": [ {"term": { "status": "active" }}, {"range": {"timestamp": { "gte": "2021-01-01T00:00:00Z", "lte": "2021-12-31T23:59:59Z" }}} ] } } } ``` 此查询将只返回状态为“active”且时间戳在2021年之间的文档。 ### 5. **高亮显示查询** 用于突出显示查询匹配到的结果。 ```json GET /index_name/_search { "highlight": { "pre_tags": ["<strong>"], "post_tags": ["</strong>"], "fields": { "title": {} } }, "query": { "match": { "title": "keyword" } } } ``` 这将在搜索结果的 `title` 字段中高亮显示匹配的关键字。 ### 相关问题: 1. **如何优化 ES 性能?** 2. **ES 的索引是如何工作的?** 3. **在实际项目中如何安全地利用 ES 进行大规模数据检索?**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值