先留个坑,详细内容后续补;
书籍:
elasticSearch在线权威指南中文版
社区:
elasticsearch中文社区
需下载的工具:
1.elasticsearch:
windows下ElasticSearch 安装
linux下elasticSearch安装
2.curl:
windows下curl安装
linux下curl安装
3.kibana:
windows下的kibana安装
linux下kibana安装
4.sense:
在 kibana5.x版本以后,sense都默认集成到kibana中,不需要手动安装(安装也安装不成功),错误参考stackoverflow一篇:https://stackoverflow.com/questions/40635566/cant-install-sense-plugin-for-kibana
如果你使用的是低于kibana5.x的版本,那么参考该文章:Windows下为Kibana安装sense插件
-----------------------
在es 6.X之后, 1个index中只能映射一个type.否则会报错
Rejecting mapping update to [website] as the final mapping would have more than 1 type: [log, blog]
详情见:https://elasticsearch.cn/question/4472
5.elasticSearch-head插件
ES6.0版本安装head插件
------------------
搜索的语法:
空搜索:GET /_search?timeout=10ms 得出所有_index 所有_type中的文档信息
限制搜索_index或者_type,如果有多个需使用,隔开 , 地址的顺序为:/_index/_type/id........
/gb/_search
在 gb
索引中搜索所有的类型
/gb,us/_search
在 gb
和 us
索引中搜索所有的文档
/g*,u*/_search
在任何以 g
或者 u
开头的索引中搜索所有的类型
/gb/user/_search
在 gb
索引中搜索 user
类型
/gb,us/user,tweet/_search
在 gb
和 us
索引中搜索 user
和 tweet
类型
/_all/user,tweet/_search
在所有的索引中搜索 user
和 tweet
类型
-------------
搜索分页:
和 SQL 使用 LIMIT
关键字返回单个 page
结果的方法相同,Elasticsearch 接受 from
和 size
参数:
size
显示应该返回的结果数量,默认是 10
from
显示应该跳过的初始结果数量,默认是 0
如果每页展示 5 条结果,可以用下面方式请求得到 1 到 3 页的结果:
GET /_search?size=5 GET /_search?size=5&from=5 GET /_search?size=5&from=10
------------------
搜索API分类:
1.“轻量的” 查询字符串
2. 使用json请求体
查询字符串:
例如,查询在 tweet
类型中 tweet
字段包含 elasticsearch
单词的所有文档:
GET /_all/tweet/_search?q=tweet:elasticsearch
如果查询条件中有多个字段,则需要使用空格分割:
GET /_all/tweet/_search?q=tweet:elasticsearch name:john
可以对字段使用+ 或 - 修饰:
+
前缀表示必须与查询条件匹配
-
前缀表示一定不与查询条件匹配
没有 +
或者 -
的所有其他条件都是可选的
GET /_search?q=+name:mary
_all字段:
如果在查询条件中没有明确指定查询字段名称,则默认是搜索_all字段
而_all字段的值就是该文档中其他字段的值组合拼成的大字符串,例如:
{
"tweet": "However did I manage before Elasticsearch?", "date": "2014-09-14", "name": "Mary Jones", "user_id": 1 }
此时_all
的字段的值为:
"However did I manage before Elasticsearch? 2014-09-14 Mary Jones 1"
多字段复杂的查询组合:
GET /us/tweet/_search?q=+name:(mary john) +date:>2014-09-10 +(aggregations geo)
上句语句的查询条件是:
name
字段中包含mary
或者john
date
值大于2014-09-10
_all_
字段包含aggregations
或者geo
查询字符做了编码后,可读性会变得很差:
查询字符串在做了适当的编码后,可读性很差:
轻量字符串查询优缺点分析:
优点:
1.可以很方便即席查询
2.查询语法简洁
缺点:
1.一些查询字符串中很小的语法错误,像 -
, :
, /
或者 "
不匹配等,将会返回错误而不是搜索结果。
2.编码后可读性差
3.查询字符串搜索允许任何用户在索引的任意字段上执行可能较慢且重量级的查询,这可能会暴露隐私信息,甚至将集群拖垮。
官方建议:不推荐直接向用户暴露查询字符串搜索功能,除非对于集群和数据来说非常信任他们。所以生产中还是使用request body查询为主,不仅可以达到相同功能,还具有额外的功能!
elasticsearch中的数据分为两类: 精确 / 全文,
精确包括日期(date类型)或用户ID(long 类型) , 搜索要么匹配要么不匹配, 而全文一般指文本数据(text类型)
- 当你查询一个 全文 域时, 会对查询字符串应用相同的分析器,以产生正确的搜索词条列表。
- 当你查询一个 精确值 域时,不会分析查询字符串, 而是搜索你指定的精确值。
请求体查询:
单一查询:
GET /_search
{
"query": {
"match": {
"tweet": "elasticsearch"
}
}
}
组合查询:
GET /_search
{
"query": {
"bool": {
"must": {
"match": {"tweet": "elasticsearch"}
},
"must_not": {
"match": {"name": "2"}
},
"should": {
"match": {"tweet": "full text"}
},
"filter": {
"range": {
"age": {"gt": 30}
}
}
}
}
}
使用bool语句组合其他条件的查询,bool可以包含的关键字有
must :必需包含
must_not :必需不包含
should :包含会增加匹配度,增加_score的分值(加分),不包含也无所谓
filter :过滤掉不满足条件的数据
官方建议:不推荐直接向用户暴露查询字符串搜索功能,除非对于集群和数据来说非常信任他们。所以生产中还是使用request body查询为主,不仅可以达到相同功能,还具有额外的功能!