ElasticSearch常用查询(一)

一、前言

​ 以前做的某个项目中包含了大量的查询聚合,现在有时间整理一番,记录一下ES常用查询聚合语法。

二、常用查询语法

2.1 match 查询

​ match查询,模糊匹配(自动分词),在进行分词的模糊匹配时,要求该字段的类型是text..keyword类型。

GET article/_search
{
  "query": {
    "match": {
      "content": "描述天气状况"
    }
  }
}


------------------------------------------------------
// 可以使用下面测试数据查看效果.
{"mappings":{"doc":{"properties":{"content":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}},"view_count":{"type":"long"},"article_name":{"type":"keyword"}}}}}

POST article/doc/
{
  "article_name":"文章一",
  "content":"这是一篇测试文章,想要测试一下match查询语法,你知道吗?",
  "view_count":27
}

POST article/doc/
{
  "article_name":"文章二",
  "content":"这是一篇天气的相关描述,你知道当前的天气状况吗?",
    "view_count":2
}

match和term的区别是,match查询的时候,elasticsearch会根据你给定的字段提供合适的分析器,而term查询不会有分析器分析的过程,match查询相当于模糊匹配,只包含其中一部分关键词就行

2.2 match_all查询

GET article/_search
{
  "query": {
    "match_all": {
    }
  }
}

2.3 multi_match查询

GET article/_search
{
  "query": {
    "multi_match": {
      "query": "知道",
      "fields": ["content"]
    }
  }
}

GET article/_search
{
  "query": {
    "multi_match": {
      "query": "文章",
      "fields": ["content"]
    }
  }
}

2.4 term查询

term查询相当于sql里面的 a = 'A'; 并且字段的类型不能为分词类型.

GET article/_search
{
  "query": {
    "term": {
      "article_name": {
        "value": "文章二"
      }
    }
  }
}

2.4 terms查询

​ terms查询相当于sql中的in 语句.

GET article/_search
{
  "query": {
    "terms": {
      "article_name": [
        "文章一",
        "文章二"
      ]
    }
  }
}

2.5 range查询

gte 表示 大于等于gt表示大于;

lte表示小于等于lt表示小于

GET article/_search
{
  "query": {
    "range": {
      "view_count": {
        "gte": 10,
        "lte": 40
      }
    }
  }
}

2.7 exists查询

GET article1/_search
{
  "query": {
    "exists": {
      "field":"view_count"
    }
  }
}

-------------------------------------------
再添加一条没有view_count的数据,用来测试
POST article1/doc/
{
  "article_name":"文章三",
  "content":"这是一篇天气的相关描述,你知道当前的天气状况吗?"
}

2.8 wildcard模糊查询

​ 模糊查询时,需要在关键词前后添加*, 并且,搜索的这个字段如果是text..keyword 这种动态类型,在搜索时需要在搜索字段后添加.keyword

​ 如果搜索的这个字段的数据类型是keyword类型,则不需要添加.keyword,但是按照keyword类型存储长文本,可能会损耗性能。

-- content字段是text...keyword类型

GET article/_search
{
  "query": {
    "wildcard": {
      "content.keyword": {
        "value": "*测试*"
      }
    }
  }
}

2.9 bool查询

bool查询,也就是多条件查询,可以将上述的简单查询条件组成不同的复杂多条件查询;其中bool需要搭配以下的查询:

(1)must查询:sql里的and关系

(2)must_not查询:和must相反

(3)should查询:sql里的or关系

(4)filter查询:也是and关系,只是说filter查询没有分数概念。

-- 查询出 article_name = "文章一" and view_count = 27 and article_name != "文章二"

GET article/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term":{
            "article_name": "文章一"
          }
        },
        {
          "term":{
            "view_count": 27
          }
        }
      ],
      "must_not": [
        {
          "term":{
            "article_name": "文章二"
          }
        }
      ]
    }
  }
}


-- 查询出文章名称为"文章一" 或者浏览量为2的数据     ---------------------
GET article/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term":{
            "article_name": "文章一"
          }
        },
        {
          "term":{
            "view_count": 2
          }
        }
      ]
    }
  }
}

-- 查询出文章名称为"文章一"并且浏览量为2的数据     -------------------------
GET article/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term":{
            "article_name": "文章一"
          }
        },
        {
          "term":{
            "view_count": 2
          }
        }
      ]
    }
  }
}

2.10 must查询

GET article/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "article_name": {
              "value": "文章一"
            }
          }
        }
      ]
    }
  }
}

2.11 must_not查询

GET article/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "term": {
            "article_name": {
              "value": "文章一"
            }
          }
        }
      ]
    }
  }
}

2.11 should查询

GET article/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "article_name": {
              "value": "文章一"
            }
          }
        }
      ]
    }
  }
}

2.13 filter查询

GET article/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "article_name": {
              "value": "文章二"
            }
          }
        },
        {
          "terms":{
            "view_count":[
              2,27
              ]
          }
        }
      ]
    }
  }
}

2.14 geo_distance地理位置圆形查询

查询方圆3000m范围内所有的用户(geo_distance)

GET user_address_info/_search
{
    "query": {
        "geo_distance": {
            "address_point": [
                114.067,
                22.55
            ],
            "distance": 3000,
            "unit":"m",
            "distance_type": "arc"
        }
    }
}

-----------------使用下面测试索引查询-----------------------------------
PUT user_address_info/
{
  "mappings":{
    "doc":{
      "properties": {
            "address_point": {
                "type": "geo_point"
            },
            "name": {
                "type": "keyword"
            }
        }
    }
  }
}

---- 插入一条数据
POST user_address_info/doc
{
  "name":"少年宫",
  "address_point":[114.067406,22.553121]
}
posted @ 2024-11-17 14:16  xiaobiao~  阅读(14)  评论(0编辑  收藏  举报