1、搜索引擎基础概念 2、ElasticSearch 3、安装ElasticSearch及API使用 ELK,Elastic Stack 搜索组件 Kibana 搜索组件开源解决方案: Sphinx lucene solr {基于lucene进一步进行封装提供搜索引擎的组件} 不适合大量的数据的搜索 ElasticSearch 收集数据组件: logstash beats工具栈 ============================================================================================================================== 1、日志收集、分析 日志数据属于半结构化数据。 2、搜索引擎的组成 搜索组件:提供搜索的组件。给用户提供搜索的接口 索引链:收集数据,构建索引,存储端 ELK(文档格式) 索引:由键值组成 数据收集:Beats 数据来源? 1、爬虫 2、例如:收集日志 3、搜索引擎查询过程 搜索组件:UI界面(提供给用户查询接口) --> 构建查询 --> 运行查询 --> 索引 --> 读取结果 --> 返回结果 索引链:原始内容 --> 构建文档 --> 文档分析 --> 创建索引 --> 作为索引的内容 4、倒排索引 每一行:搜索关键字被切分后的词作为列字段,列字段所对应的值为包含该词的文档。 5、搜索引擎的实现 搜索链:Lucene {只是一个开发库,没有提供搜索界面} 搜索组件:ElasticSearch 数据收集组件:logstash{收集日志}、solr、Nutch、Grub、Apeture 6、Lucene 文档:Document,包含一个或多个域(field)的容器,以及域相对应的值。 域:域有很多选项。包括{索引选项、存储选项、域项量使用选项} 索引选项:(通过倒排索引控制文本是否可被搜索) Index.ANYLYZED 分析切词并单独作为索引项 Index.Not-ANYLYZED 不分析切词,把整个内容当作一个索引项 Index.ANYLYZED_NORMS 类似于Index.ANYLYZED,但不存储token的Norms(加权基准)信息 Index.ANYLYZED_NORMS_NORMS 类似于Index.Not-ANYLYZED,但不存储token的Norms(加权基准)信息 Index.NO 不对此域的值进行索引,因此不能被搜索 存储选项: (是否需要存储域的真实值) store.YES 存储真实值 store.NO 不存储真实值 域项量选项: (用于在搜索该文档所有的唯一项都能完全从文档中检索时使用) 7、搜索 查询Lucene索引时,它返回的是一个有序的scoreDoc对象,查询时,Lucene会为每一个文档计算出score 搜索通过其API实现: IndexSearche 搜索索引入口 Querty及其子类 QuertParser TopDocs ScoreDOc ============================================================================================================================= ElasticSearch 1、搜索组件,调用Lucene实现的一个搜索组件,并且ElasticSwarch将Lucene的功能扩展。将一个大索引切片,并将这个索引的多个切片分布 到不同的物理节点上,完成分布式的搜索。 为了保证数据的高可用性,在切片级别对数据进行冗余。被搜索的数据是无中心式的分布式,每一个节点都可以接受对所有搜索内容的请求。 此外,ElasticSearch还是一个实时的分布式文档存储,其中每个文档的每个field均是被索引的数据,且可被搜索。 2、组成 基本组件 索引:index,文档容器 类型:type,索引内部的逻辑分区 文档分析:document,是Lucene搜索的原子单位,由一个或多个域组成,JSON格式。 映射:mapping,定义分析机制 _index 文档存储的地方 _type 文档代表的对象的类 _id 文档的唯一标识 集群组件 CLuster:ES的集群标识位集群名称,默认为 elasticsearch ,节点就是靠此名称来界定加入到那个集群中,一个节点只能属于一个集群 Node:运行了单个ES实例的主机即为节点,用于存储数据,参与集群索引即搜索的操作,节点标识靠节点名 Shard:将一个索引切割为多个物理存储块,每个shard都是一个独立且完整的索引。shard有两种类型:primary shard 和 replica,每一 个primary shard应该至少有一个replica。replica用于数据冗余和负载均衡。replica数量可以自定义。replica的数量一旦确定, 就不能修改。 在ES中一个数据集被称为索引(index),类似于MySQL中的database,类型(type)类似于MySQL中的表,一个index中可以有多个type, 每一个type中的数据单位为document,类似于MySQL中的行。文档的结构都是JOSN格式。数据被分割为多个块,并均匀的存储到不同 的节点上,每一个分片在不同的节点上都有其副本(replica shard)作为它的冗余shard。 3、集群工作过程 1、通过多播(默认)或单播方式在9300/tcp查找同一个集群中的其他节点,并与之建立通信。 2、集群中的所有节点会选举一个主节点负责个整个集群状态,以及在集群范围内决定个shard的分布式方式,在用户角度而言,每个节点均 可接收各类请求。 集群状态: green:所有主副分别在完整 yellow:缺少某些分别,但能够恢复 red:缺少分别且不能恢复 3、主节点会周期性的检查节点的状态 ============================================================================================================================= 安装ElasticSearch及API使用 1、官方站点 https://www.elastic.co 2、前提 Elasticsearch是使用Java构建的,并且至少需要 Java 8才能运行。只有Oracle的Java和OpenJDK被支持。所有Elasticsearch节点和客户端都 应该使用相同的JVM版本。 每个节点都能够解析主机名,同步时间。 3、安装 yum install elasticsearch-6.0.0.rpm 4、配置过程 配置文件: /etc/elasticsearch/ elasticsearch.yml # 用于配置Elasticsearch jvm.options # 用于配置Elasticsearch JVM设置 log4j2.properties # 用于配置Elasticsearch日志记录 程序文件: /usr/share/elasticsearch/bin/elasticsearch /usr/share/elasticsearch/bin/elasticsearch-keystore /usr/share/elasticsearch/bin/elasticsearch-plugin 管理插件程序 创建数据目录: mkdir -pv /els/{data,log} 修改属组属主: chown -R elasticsearch.elasticsearch /els/* 修改配置并启动: vim /etc/elasticsearch//etc/elasticsearch.yml cluster.name: xuekaixin # 集群名称 node.name: node1 # 节点名称 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 192.168.0.1 # 当前节点主机的IP地址 http.port: 9200 discovery.zen.ping.unicast.hosts: ["node0", "node1", "node2"] # 定义集群成员关系,写主机名的前提是节点能够解析主机名,否则写成IP地址 discovery.zen.minimum_master_nodes: 2 # 避免脑裂 修改JVM配置文件: vim /etc/elasticsearch/jvm.options -Xms700m -Xmx700m 启动服务: systemctl start elasticsearch.service 5、配置集群 # 三个节点都安装 JDK 和 elasticsearch # 启动服务 # tcpdump -i eth0 -nn tcp port 9300 抓包查看集群心跳信息 6、Restful API 四类: 1、检查集群、节点、索引等健康与否,以及获取其相应状态 2、管理集群、节点、索引及元数据 3、执行CRUD操作 4、执行高级操作,如paging、filtering 7、ES访问接口 curl -X '://:/?' -d '' :GET|PUT|DELETE PROTOCOL:http|https :/_cat, /_search, /_cluster :查询参数 :请求主题 示例: 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' Note: curl -XGET 'http://172.18.26.5:9200/_cat/' # 可查看_cat后可使用的参数 =^.^= /_cat/allocation /_cat/shards /_cat/shards/{index} /_cat/master /_cat/nodes /_cat/tasks /_cat/indices /_cat/indices/{index} /_cat/segments /_cat/segments/{index} /_cat/count /_cat/count/{index} .... .... curl -XGET 'http://172.18.26.4:9200/_cat/health?v' # 可查看对应的详细信息 curl -XGET 'http://172.18.26.4:9200/_cat/health?help' # 查看帮助信息 curl -XGET 'http://172.18.26.1:9200/_cluster/stats?pretty' 8、手动操作索引 # 创建索引 curl -XPUT 'http://172.18.26.1:9200/books' # 获取文档 curl -XGET 'http://172.18.26.1:9200/_cat/indices?pretty' # 删除文档 curl -XDELETE 'http://172.18.26.1:9200/books' # 创建索引 curl -XPUT 'http://172.18.26.1:9200/books' # 添加一个文档 [ root@node0 ]# curl -XPUT -H'Content-Type: application/json' 'http://172.18.26.1:9200/books/computer/1' -d '{ "name": "ElasticSearch Cookbook - Second Edition", "date": "Jan 28 2015", "author": "Alberto Paro" }' # 查看文档 curl -XGET 'http://172.18.26.1:9200/books/computer/1?pretty' # 添加另第二个文档 [ root@node0 ~ ]# curl -XPUT -H'Content-Type: application/json' '172.18.26.1:9200/books/computer/2' -d '{ "name": "Elasticsearch: A Complete Guide", "date": "Jan 31 2017", "author": "Bharvi Dixit and Rafal Kuc" }' # 添加第三个文档 [ root@node0 ~ ]# curl -XPUT -H'Content-Type: application/json' '172.18.26.1:9200/books/computer/3' -d '{ "name": "Elasticsearch: Quick primer", "date": "Dec 4 2015", "author": "Chinna M" }' # 添加文档 [ root@node0 ~ ]# curl -XPUT -H'Content-Type: application/json' '172.18.26.1:9200/books/computer/3' -d '{ "name": "Apache: The Definitive Guide", "date": "Dec 4 2015", "author": "xuekaixin" }' # 搜索{不指定搜索条件,匹配所有文档} curl -XGET 'http://172.18.26.1:9200/books/computer/_search?pretty' # 搜索{指定搜索关键字} curl -XGET 'http://172.18.26.1:9200/_search?q=Elasticsearch&pretty' # Query DSL =========================================================================================================================== ElasticSearch Plugins 1、插件 扩展ES的功能。添加自定义的映射类型、自定义分析器、本地脚本、自定义发现方式。 2、安装 /usr/share/elasticsearch/plugins /usr/share/elasticsearch/bin/elasticsearch-plugin # 管理plugin的脚本 3、elasticsearch-head插件安装配置 # 安装git yum install git # 安装npm yum install npm # 安装 cd elasticsearch-head/ npm install # 修改elasticsearch.yml配置文件 http.cors.enabled: true http.cors.allow-origin: "*" =========================================================================================================================