Lucene有两大任务:索引文档(倒排索引),搜索文档。
多域搜索MultiFieldQuery,可以取多个字段查询关键词。
词项搜索TermQuery,查询某个字段的关键词。
布尔搜索BooleanQuery,组合查询,把各种Query添加进去并标明其逻辑关系,例如{title:人工智能} and {content:深度学习}。
范围搜索RangeQuery,满足范围内的搜索。
前缀搜索PrefixQuery,查询关键词前缀。
多关键词搜索PhraseQuery,几个关键词之间是否允许或允许多少个无关词汇。
模糊搜索FuzzyQuery,简单识别相近词语。
通配符搜索WildcardQuery。
高频词提取:IndexReader的getTermVector()获取文档的Terms,根据其词频(Term Frequency)放入Map,倒序输出。
分片:将索引划分成多份。创建索引可指定分片数量,每个分片是功能完善且独立的索引,可以放在任何节点上。方便水平分割、扩展内容容量。在多节点上进行分布式并行操作,提升性能吞吐量。
副本:保证高可用,副本不与主分片放在同一节点上。扩展搜索量、吞吐量。搜索可以在所有副本上并行运行,在这一点上与Kafka不同。
默认5分片1副本,分片不可改,副本可改。
路由机制:文档索引到某分片。shard=hash(routing--默认docId)%主分片数。余数范围必是0~主分片数-1。
执行添加索引操作时,可以指定routing,相同routing会分配到同一分片,而查询时指定routing,直接去对应的分片查询,不再广播。
搜索机制:
1、输入原始文档。
2、保存原始文档,生成docId。
3、通过分词过滤生成倒排索引。
4、用户查询,分词,查询倒排索引,定位文档集。
5、对文档进行评分、排序、高亮处理后返回。
集群查询过程:
1、请求被某节点接收,此为通道节点。
2、广播到索引的每个分片上。
3、分片执行并返回。
4、通道节点接收结果,合并、排序返回。
版本控制:
Elasticsearch是分布式,对文档的操作要复制到其他节点中,且是异步并发,请求不是顺序到达,旧版本可能会覆盖新版本。
文档每修改一次,_version+1,低版本到达后会被忽略。
Elasticsearch的版本控制机制有:
内部版本控制:每次操作,版本号相同才能操作成功。
外部版本控制:外部版本号>内部版本号,才能操作成功。