搜索引擎两大核心组件
索引组件
搜索组件
构建了索引才能执行搜索操作
索引组件:把索引内容转换成文档格式,最后构建成倒排索引,存储在索引的文件中(最终存储结果是一个又一个的分片 shared)每一个shared都是一个个完整独立的索引
lucene:索引组件、倒排索引
搜索组件:可以提供用户界面,搜索关键词,把关键词做分析后,生成查询条件
Solr, ElasticSearch
els:分布式的搜索组件
分片:shard
Primary Shard 主分片
Replica Shard 副本分片
状态:green (主副本分片都在)/yellow(有一个出现问题)/red(某一分片主副本都丢失)
clustername 识别集群成员方法 els5之后,节点发现就只要单播了
Lucene:有几个核心组件
索引、类型、文档
映射
访问API是用resuletfullAPI,通过http协议输出,使用curl命令就能直接访问
RESTful API:
curl -X<VERB http请求方法get,put> ‘😕/:/
<BODY http协议的body>:json格式的请求主体;
<VERB
GET 获取,POST,PUT 上传,DELETE
特殊:/_cat, /_search, /_cluster,所有端口请求用search发出
之前搜索是针对students进行,也可以针对所有索引进行
不带索引就是,可以理解这对整个集群进行
也可以只针对固定的类型,针对索引的,特定类型,对应字符串的对应文档
**对应操作执行多长时间
是否超时
一个搜索多少分片,5
多少个分片成功 **
curl -XGET ‘http://10.1.0.67:9200/_cluster/health?pretty=true’ 向集群发生请求,是否监控
curl -XGET ‘http://10.1.0.67:9200/_cluster/stats?pretty=true’ 查看集群统计数据
curl -XGET ‘http://10.1.0.67:9200/_cat/nodes?pretty’
curl -XGET ‘http://10.1.0.67:9200/_cat/health?pretty’
创建文档:
curl -XPUT 文档无非就是kV组成的数据
文档:
{“key1”: “value1”, “key2”: value, …}
查询:
ELS:很多API
_cluster, _cat, _search
curl -X GET ‘<SCHEME://:/[INDEX/TYPE/]_search?q=KEYWORD&sort=DOMAIN:[asc|desc]&from=#&size=#&_source=DOMAIN_LIST’
可以进行复杂的查询格式,多索引多类型,发起搜索
/_search:搜索所有的索引和类型;
/INDEX_NAME/_search:搜索指定的单个索引;
/INDEX1,INDEX2/_search:搜索指定的多个索引;
/s/_search:搜索所有以s开头的索引;使用通配符来表示
/INDEX_NAME/TYPE_NAME/_search:搜索指定的单个索引的指定类型;*
搜索使用的url
获取指定的文档
去搜索students下的major下的1号文档
格式美观一点+?pretty
found =true找到内容了,source{}标识文档本身
真正发送搜索请求时,ELS支持两种类型的查询方式,
q=关键词,简单字符串查询
(1) q=KEYWORD, 相当于q=_all:KEYWORD
(2) q=DOMAIN:KEYWORD
不管哪种查询都需要基于search端点进行
查询类型:1.Query DSL json格式查询表达的语言,2.简单字符串(q=XXX字符串);
文本匹配的查询条件:
(1) q=KEYWORD, 相当于q=_all:KEYWORD 仅能实现较为简单的查询,也是lucene支持的查询方式,用的最多
(2) q=DOMAIN:KEYWORD
{
“name” : “Docker in Action”,
“publisher” : “wrox”,
“datatime” : “2015-12-01”,
“author” : “Blair”
}
_all: "Docker in Action Wrox 2015-12-01 Blair"
修改默认查询域:df属性
查询修饰符:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-uri-request.html
获取一个指定索引的所有文档
查询符合条件的文档,q=XX类似使用
搜索包含jianfa对应字符串的文档
文档有很多KV,搜索剑法搜索哪个key,所有的key。locene构建文档时,会把键的所有数据,连在一起,生成一个特殊键会生成_all,key的数据是把整个三个字段链接起来
这个键会由ES或lucene自行构建
指明在哪个字段进行搜索
hits真正符合条件等于0
如果在course找就有 了
相当于_all字段
搜索a就找不到,因为是切词的,不能搜索里面的单个字符
搜索的时候怎么切,索引也需要怎么切,否则搜索出不来,之前并没有根据字母来切
这种就是所谓的词条搜索,jianfa是完整的词http://lucene.apache.org/core/6_6_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package.description
and
表示另外字段,
词条修饰器
正则表达式模式搜索
模糊搜索
有一个字符不匹配是可以的2.有两个字符不匹配也是可以的
近似度查询
在一个字段上写一个字符到另外一个字符 [],范围查询,也可以基于字符串之间的所有字符,{}
找一下年龄在15-20
可能els5.5中的命令行写法有所改变
对一个词条进行提权,对搜索第一个字符的权重4倍高于第二个
表达多个条件,or ,and ,not
分组,这两个出现任意一个并且 出现website
大致用到的符号有这么多,6.6.0
简单字符串的语法格式
http://lucene.apache.org/core/6_6_0/queryparser/org/apache/lucene/queryparser/classic/package-summary.html#package.description
如果显示文档只向显示指定的键,age,name不显示了
命令2个文档
返回字段:
fields=
注:5.X不支持;自定义分析器:
analyzer=
默认操作符:OR/AND
default_operator, 默认值为OR
返回字段:
fields=
注:5.X不支持;
结果排序:
sort=DOMAIN:[asc|desc]
搜索超时:
timeout=
查询结果窗口:结果多过可以只显示10个
from=,默认为0;
size=, 默认为10;
从0开始只显示10个文档
显示几个用size来定义,from类似偏移量
对查询结果可以排序
按照年龄排序
降序
查询修饰符:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-uri-request.html
这个是复杂查询给出,语句的查询
响应结果各自表示是什么
查询时文档所属的索引
所属类型
id
得分很关键,排序默认按得分来的
查询历经时长,单位毫秒。true代表超时
shareds代表这些查询针对哪些分片进行,total2,有2个
successfil,falsed有多少成功,多少失败
命中7个文档,最高多少分,
可以生成查询语句哪个字段,哪个键,允许出现还是不允许出现
range范围查询 大于等于15 小于等于20
kibana和ELS交互依然用resultfull风格的http协议api进行,最好找一个专门的主机当kibana(使用nodejs研发的)
配置文件kibana.yml
默认监听端口是5601
base.path代表urlpath
node1节点名字
elasticsearch.url els主机在哪里
直接启动
能搜索任何ELS的索引
创建过滤器只针对特定索引搜索
对应的索引就这么几个字段
对应的所有内容就已经显示出来了
course当中有jianfa的进行搜索
年龄15到20
年龄18到30或者course中 有zhang
可以有一个字符不一样
在course中出现a的
也可以对某个词条做提权,可以用名字或者年龄来创建分段和比例
平行的bar
现状图
饼图
垂直柱状图
这个索引是kibana自己用的,不要动
用另外一个节点当web服务,装一个nginx或apache,tomcat,用于保存日志
做一个页面来做下测试访问
访问的日志如何导入到ELS,
1.可以在本地安装日志抽取工具filebeat/logstash,但是filebeat无法构建更加精准的文档,可以在els和web服务中间加一个filebeat,
可以自己定义如何去读取提供本地的文件,而后向哪发送数据
input-type输入格式,读日志的
path 从哪些内容读日志
读取的内容,然后发 到哪里去
发送的列表可以给多个节点
访问一下网站
生成的日志数据就能够被发往ELS,只不过els需要导入filebeat模版,对应索引是filebeat,是按天变化的
想搜索在kibana中重新创建一个
filebeat没有多少切片能力,logstash有很好的能力,再找一个主机配置logstash,logstash把数据读到本地正规化,把结果再发送给ELS
logstash基于ruby,先安装JDK
主配置文件
用管理员账号跑可能会有一些冲突,logstash默认用户是nologin,可能切换不过去,可以换成bin/bash
这个配置文件不怎么需要修改
无法读到主配置文件,建议使用–path.setting,来指明到哪里读对应主配置文件
logstash每一个数据的输入从n多位置输入https://www.elastic.co/cn/products/logstash
https://www.elastic.co/guide/en/logstash/current/input-plugins.html
输入插件都放在input中,输出放在outputhttps://www.elastic.co/guide/en/logstash/current/plugins-inputs-stdin.htm
加个tags标签
require no代表是 不给都没有问题
输出,只要 保存数据几乎都能输出
https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.htmll
https://www.elastic.co/guide/en/logstash/current/plugins-outputs-stdout.html stdout标准输出
-t表示语法测试,测试后退出并不真正执行 -f指明配置文件
输入数据,哪个主机生成的,生成的信息是什么,输出为json格式
version版本号
host哪个主机
再次修改配置,把stdin内部改成固定格式的
add filed加字段
有错误继续修改
在output上加有条件来实现,再次测试
输入有N种类型,输出有N种类型https://www.elastic.co/guide/en/logstash/current/plugins-inputs-beats.html
数据类型是string都要加引号
修改配置文件
之前是向beats发送数据,现在改为logstash
重启filebeat
filebeat只会读取新生成的数据,再次请求
已经生成数据
默认把所有日志放到一个message中
logstash还有一个插件filter,过滤器,能实现把输入的数据正规化,一片片数据