ES为什么那么快?正是因为ES内部采用了倒排索引。让我们来看下什么是倒排索引吧。
1 我是中国人
2 我是大学生
如果使用正排索引的话,建立索引的过程是这样的:
切词结果:
1 我 我是 中国 中国人
2 我 我是 大学 大学生
将切词结果进行创建索引,保存文章/id。当搜索的时候,
索引库中如有匹配则返回文章内容。
不足:通过切词之后,索引比正文多了。
倒排索引:
1. 我(1:1){0},(2:1){0}
2. 我是(1:1){0},(2:1){0}
3. 中国(1:1){2}
4. 中国人(1:1){2}
5. 大学(2,1){2}
6. 大学生(2,1){2}
解释:
()中保存的第一个元素是文章id,第二个元素是出现次数。
{} 中保存的是当前分词在文章中的偏移量。
通过这样的方式,当我们去搜索的时候。比如搜索‘中国’,当拿到中国的时候
就可以看到哪些地方含有中国这两个字。类似于字典的目录。
大型分布式日志分析系统ELK
elasticsearch(存储日志)+
logstash(收集日志) +
kibana(展示数据)
大型电商商品搜索系统
网盘搜索引
网站内搜索
为什么要进行版本控制
为了保证数据再多线程操作下的准确性
悲观锁和乐观锁
内部版本控制和外部版本控制
Cluster
代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
Shards代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
replicas代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
Recovery代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
input {
jdbc {
jdbc_driver_library => "G:\develop\logstash-7.3.2\bin\job\mysql-connector-java.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://localhost:3306/drugs_manager"
jdbc_user => "root"
jdbc_password => "root"
schedule => "* * * * *"
statement => "SELECT * FROM drugs;"
use_column_value => true
tracking_column_type => "timestamp"
tracking_column => "update_time"
last_run_metadata_path => "syncpoint_table"
}
}
#output {
# stdout {
# codec => rubydebug
# }
#}
output {
elasticsearch {
hosts => ["127.0.0.1"]
user => ""
password => ""
index => "drugs_manager"
document_id => "%{id}"
}
}