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的版本控制机制有:

内部版本控制:每次操作,版本号相同才能操作成功。

外部版本控制:外部版本号>内部版本号,才能操作成功。