查询索引下的全部数据
GET /book/_search
{
"took" : 333,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "book",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"name" : "Bootstrap开发",
"description" : "Bootstrap是由Twitter推出的一个前台页面开发css框架,是一个非常流行的开发框架,此框架集成了多种页面效果。此开发框架包含了大量的CSS、JS程序代码,可以帮助开发者(尤其是不擅长css页面开发的程序人员)轻松的实现一个css,不受浏览器限制的精美界面css效果。",
"studymodel" : "201002",
"price" : 38.6,
"timestamp" : "2019-08-25 19:11:35",
"pic" : "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags" : [
"bootstrap",
"dev"
]
}
},
{
"_index" : "book",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"name" : "java编程思想",
"description" : "java语言是世界第一编程语言,在软件开发领域使用人数最多。",
"studymodel" : "201001",
"price" : 68.6,
"timestamp" : "2019-08-25 19:11:35",
"pic" : "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags" : [
"java",
"dev"
]
}
},
{
"_index" : "book",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"name" : "spring开发基础",
"description" : "spring 在java领域非常流行,java程序员都在用。",
"studymodel" : "201001",
"price" : 88.6,
"timestamp" : "2019-08-24 19:11:35",
"pic" : "group1/M00/00/00/wKhlQFs6RCeAY0pHAAJx5ZjNDEM428.jpg",
"tags" : [
"spring",
"java"
]
}
}
]
索引结果解析
took:耗费了几毫秒
timed_out:是否超时,这里是没有
_shards:到几个分片搜索,成功几个,跳过几个,失败几个。
hits.total:查询结果的数量,3个document
hits.max_score:score的含义,就是document对于一个search的相关度的匹配分数,越相关,就越匹配,分数也高
hits.hits:包含了匹配搜索的document的所有详细数据
简易的按条件查询
GET /book/_search?q=name:java
#按照结果降序 , "max_score" : null:不会计算分数
GET /book/_search?q=name:java&sort=price:desc
设置超时时间
GET /book/_search?timeout=10ms
全局设置:配置文件中设置 search.default_search_timeout:100ms。默认不超时。
GET /book/_search?timeout=0ms
设置超时时间是 0ms 也可以查询出来数据…
避免用户一直等待查询结果,过了超时时间可以返回已经查询完毕的数据 ,有几条给几条
multi-index搜索模式
x /_search:所有索引下的所有数据都搜索出来
/index1/_search:指定一个index,搜索其下所有的数据
/index1,index2/_search:同时搜索两个index下的数据
/index*/_search:按照通配符去匹配多个索引
应用场景:生产环境log索引可以按照日期分开。
log_to_es_20190910
log_to_es_20190911
log_to_es_20180910
简单分页
GET /book/_search?size=10
GET /book/_search?size=10&from=0
GET /book/_search?size=10&from=20
GET /book_search?from=0&size=3
DSL
查询全部 索引 排序
#查询所有
GET /book/_search
{
"query": {"match_all": {}}
}
#排序
GET /book/_search
{
"query": {
"match": {
"name": "java"
}
},
"sort": [
{
"price": {
"order": "desc"
}
}
]
}
#指定字段
GET /book/_search
{
"query": {"match_all": {}},
"_source": ["name","price"]
}
练习
搜索需求:title必须包含elasticsearch,content可以包含elasticsearch也可以不包含,author_id必须不为111bool查询包括 : must , should,must_not
GET /website/_search
{
"query": {
"bool": {
"must": [
{"match": {
"title": "elasticsearch"
}}
],
"should": [
{"match": {
"content": "hadoop"
}}
],
"must_not": [
{"match": {
"author_id": 111
}}
]
}
}
}
#qury+bool+must = match
GET /website/_search
{
"query": {
"match": {
"title": "hadoop"
}
}
}
更为复杂的查询要求
# 匹配全部
GET /book/_search
{
"query": {
"match_all": {
}
}
}
#查询关键字段 java程序员 会被分为 java + 程序员两个字段
GET /book/_search
{
"query": {
"match": {
"description": "java程序员"
}
}
}
#一个字段在两个属性中查询
GET /book/_search
{
"query": {
"multi_match": {
"query": "java程序员",
"fields": ["name","description"]
}
}
}
# 范围查询
GET /book/_search
{
"query": {
"range": {
"price": {
"gte": 60,
"lte": 70
}
}
}
}
#不进行分词查询 java程序员不会被分为java 程序员 ,termquery
GET /book/_search
{
"query": {
"term": {
"description": "java"
}
}
}
#term 多个字段不进行分词查询
GET /book/_search
{
"query": {
"terms": {
"description": [
"java",
"spring"
]
}
}
}
#模糊查询 相似匹配 {jave-> java 然后再进行查询}
GET /book/_search
{
"query": {
"fuzzy": {
"description": {
"value": "jave"
}
}
}
}
Filter 过滤器
让搜索参与结果集当中,但是你不想参与评分计算
将range 写入 must 中 符合 range范围的查询会参与结果评分之中
GET /book/_search
{
"query": {
"bool": {
"must": [
{"match": {
"description": "java程序员"
}},
{
"range": {
"price": {
"gte":60,
"lte": 80
}
}
}
]
}
}
}
#正确写法
GET /book/_search
{
"query": {
"bool": {
"must": [
{"match": {
"description": "java程序员"
}}
],
"filter": {
"range": {
"price": {
"gte": 50,
"lte": 20
}
}
}
}
}
}
filter,不需要计算相关度分数,不需要按照相关度分数进行排序,同时还有内置的自动cache最常使用filter的数据
query,相反,要计算相关度分数,按照分数进行排序,而且无法cache结果
定位错误语法
GET /book/_validate/query?explain
{
"query": {
"mach": {
"description": "java程序员"
}
}
}
只进行过滤不进行搜索
# query 下面增加filter 字段
GET /book/_search
{
"query": {
"constant_score": {
"filter" : {
"term" : {
"studymodel" : "201001"
}
}
}
}
GET /book/_search
{
"query": {
"constant_score": {
"filter" : {
"term" : {
"studymodel" : "201001"
}
}
}
},
"sort": [
{
"price": {
"order": "asc"
}
}
]
}
英文进行排序,但不加入索引
PUT /website
{
"mappings": {
"properties": {
"title": {
"type": "text",
"fielddata": "true"
},
"content": {
"type": "text"
},
"post_date": {
"type": "date"
},
"author_id": {
"type": "long"
}
}
}
}
索引分批
GET /book/_search?scroll=1m
{
"query": {
"match_all": {}
},
"size": 3
}
{
"_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAMOkWTURBNDUtcjZTVUdKMFp5cXloVElOQQ==",
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
]
}
}
GET /_search/scroll
{
"scroll": "1m",
"scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAMOkWTURBNDUtcjZTVUdKMFp5cXloVElOQQ=="
}