基础查询:简单查询,条件查询,聚合查询
简单查询:
(GET)127.0.0.1:9200/book/novel/1
条件查询:
-- 查询全部数据
(POST)127.0.0.1:9200/book/_search
{
"query":{
"match_all":{}
}
}
-- 分页查询全部数据
(POST)127.0.0.1:9200/book/_search
{
"query":{
"match_all":{}
},
"from":1,
"size":4
}
-- 关键词查询数据。title字段中包含ElasticSearch的数据
(POST)127.0.0.1:9200/book/_search
{
"query":{
"match":{"title":"ElasticSearch"}
}
}
-- 关键词查询并排序
(POST)127.0.0.1:9200/book/_search
{
"query":{
"match":{ "title":"ElasticSearch" }
},
"sort":[
{"publish_date":{"order":"desc"}}
]
}
聚合查询:
(POST)127.0.0.1:9200/book/_search
{
"aggs":{
"group_by_word_count":{ -- 自定义
"terms":{ -- 关键词
"field":"word_count" -- 指定字段
}
}
}
}
(POST)127.0.0.1:9200/book/_search
{
"aggs":{
"group_by_word_count":{ -- 自定义
"terms":{ -- 关键词
"field":"word_count" -- 指定字段
}
},
"group_by_publish_date":{
"terms":{
"field":"publish_date"
}
}
}
}
(POST)127.0.0.1:9200/book/_search
{
"aggs":{
"grades_word_count":{
"stats":{
"field":"word_count"
}
}
}
}
高级查询:子条件查询,复合条件查询
子条件查询: 特定字段查询所知特定值
Query context:
在查询过程中,判断文档是否满足查询条件外,ES还会计算一个_score来标识匹配的程度,旨在判断目标文档和查询条件匹配的有多好
全文本查询:针对文本类型数据
字段级别查询:针对结构化数据,如数字,日期等
Filter context
在查询过程中,只判断该文档是否满足条件,只有Yes或者No
复合条件查询:以一定的逻辑组合子条件查询
全文本查询:如下写法模糊查询会匹配ElasticSearch 和 入门
(POST)127.0.0.1:9200/book/_search
{
"query":{
"match":{
"title":"ElasticSearch入门"
}
}
}
其余匹配查询:模糊匹配ElasticSearch入门
(POST)127.0.0.1:9200/book/_search
{
"query":{
"match_phrase":{
"title":"ElasticSearch入门"
}
}
}
多个字段的匹配查询
(POST)127.0.0.1:9200/book/_search
{
"query":{
"multi_match":{
"query":"瓦力",
"fields":["author","title"]
}
}
}
语法查询:用于数据搜索,支持通配符,范围查询,布尔查询,正则。语法表达丰富
(POST)127.0.0.1:9200/book/_search
{
"query":{
"query_string":{
"query": "ElasticSearch AND 大法"
}
}
}
{
"query":{
"query_string":{
"query": "(ElasticSearch AND 大法) OR Python"
}
}
}
{
"query":{
"query_string":{
"query": "ElasticSearch OR Python",
"fields": ["title","author"]
}
}
}
字段查询:
{
"query":{
"term":{
"word_count": 1000
}
}
}
{
"query":{
"term":{
"author": "瓦力"
}
}
}
{
"query":{
"range":{
"word_count":{
"gte": 1000,
"lte": 2000
}
}
}
}
{
"query":{
"range":{
"publish_date":{
"gte": "2017-0102",
"lte": "now",
"time_zone":"+08:00" 时区!!!!!
}
}
}
}
Filter context,比query快一点,需要结合bool一起使用
{
"query":{
"bool":{
"filter":{
"term":{ "word_count":1000 }
}
}
}
}
复合条件查询:
固定分数查询,布尔查询,等等
固定分数查询:
{
"query":{
"constant_score":{
"filter":{
"match":{
"title":"ElasticSearch"
}
}
},
"boost":2
}
}
布尔查询
{
"query":{
"bool":{
"should":[ -- OR的关系
{
"match":{"author":"瓦力"},
},
{
"match":{"title":"ElasticSearch"}
}
]
}
}
}
{
"query":{
"bool":{
"must":[ -- AND 的关系
{"match":{"author","瓦力"}},
{"match":{"title":"ElasticSearch"}}
]
}
}
}
组合
{
"query":{
"bool":{
"must":[
{"match":{"author":"瓦力"}}
],
"filter":[
{"term":{"word_count":1000}
}
]
}
}
}
{
"query":{
"bool":{
"must_not":{ -- 不等于
"term":{"author":"瓦力"}
}
}
}
}
查询中 term,terms,match,match_phrase的区别?
==========================es 权威指南
匹配所有文档
{
"query":{
"match_all":{}
}
}
查询子句:
{
"match":{
"tweet":"elasticsearch"
}
}
完整的请求:
{
"query":{
"match":{"tweet":"elasticsearch"}
}
}
合并多子句
{
"bool":{
"must":{"match":{"tweet":"elasticsearch"}},
"must_not":{"match":{"name":"mary"}},
"should":{"match":{"tweet":"full text"}}
}
}
term 过滤:主要用于精确匹配哪些值,比如数字,日期,布尔值或not_analyzed的字符串
{"term":{"age":26}}
terms 过滤:和term类似,但terms允许指定多个匹配条件
{"terms":{"tag":["search","full_text",nosql]}}
range 过滤:允许我们按照指定范围查找一批数据
{"range":{"age":{"gte":20,"lte":30}}}
exists 和 missing 过滤:可以用于查找文档中是否包含指定字段或没有某个字段,类似于IS NULL条件
missing 本质是exists的反义词
{"exists":{"field":"title"}}
bool 过滤:可以用来合并多个过滤条件查询结果的布尔逻辑,它包含以下操作符:
must: 多个查询条件的完全匹配,相当于 and
must_not: 多个查询字段的相反匹配,相当于not
should:至少有一个查询条件匹配,相当于or
{
"bool":{
"must":{"term":{"folder":"index"}},
"must_not":{"term":{"tag":"span"}},
"should":[
{"term":{"starred":true}},
{"term":{"unread":true}}
]
}
}
match 查询 是一个标准查询,不管是全文本查询还是精确查询基本都要用到它
match 查询全文本字段,他会在真正查询之前用分析器先分析match一下查询字符
{"match":{"tweet":"about search"}}
match 查询确切值,搜索给定值
{"match":{"tag":"full_text"}}
PS:做精确匹配搜索时,最好使用过滤语句,因为过滤语句可以缓存数据
multi_match 允许你做match查询的基础上同时搜索多个字段
{
"multi_match":{
"query":"full text search",
"fields":["title","body"]
}
}
bool 查询 与 bool 过滤相似,用于合并多个子查询语句。
不同的是,bool过滤可以直接给出是否匹配成功,而bool查询要计算每一个子查询语句的_score
must: 指定文档一定要被包含
must_not: 指定文档一定不要被包含
should:指定文档,有则可以为文档相关性加分
{
"bool":{
"must":{"match":{"title":"how to make millions"}},
"must_not":{"match":{"tag":"spam"}},
"should":[
{"match":{"tag":"starred"}},
{"range":{"date":{"gte":"2018-09-01"}}}
]
}
}
PS: 如果bool查询下没有must子句,那么至少应该有一个should子句
查询和过滤条件的合并:
查询语句:
{
"match":{"email":"bussiness opportunity"}
}
加入term过滤:
{
"term":{"folder":"inbox"}
}
search API中指南包含query语句,所以我们需要用filtered来同时包含"query"和"filter"
{
"filtered":{
"query":{"match":{"email":"bussiness opportunity"}},
"filter":{"term":{"folder":"inbox"}}
}
}
外面再加入query的上下文关系
{
"query":{
"filtered":{
"query":{"match":{"email":"bussiness opportunity"}},
"filter":{"term":{"folder":"inbox"}}
}
}
}
count: 查询结果的条数
java代码 : org.elasticsearch.client.transport 和 es 版本:5.4.16
long loginNum = loginSrb.setSize(0).setQuery(boolQueryBuilder).get().getHits().totalHits;
get:
t_log_info/logInfo/_count
删除es数据
post t_log_info/logInfo/_delete_by_query
{
"query": {
"match_all": {}
}
}