本文共 5190 字,大约阅读时间需要 17 分钟。
搜索引擎两大核心组件 索引组件 搜索组件 构建了索引才能执行搜索操作 索引组件:把索引内容转换成文档格式,最后构建成倒排索引,存储在索引的文件中(最终存储结果是一个又一个的分片 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> ‘😕/:/<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, _searchcurl -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,过滤器,能实现把输入的数据正规化,一片片数据转载地址:http://jckgn.baihongyu.com/