1.如何读取elasticsearch的源s源分词索引信息
2.手机怎么检查源代码
3.es lucene搜索及聚合流程源码分析
4.ElasticSearch源码:数据类型
5.centos怎么读 英语centos怎么读
6.ElasticSearch源码:Shard Allocation与Rebalance(1)
如何读取elasticsearch的分词索引信息
一、插件准备
网上有介绍说可以直接用plugin -install medcl/elasticsearch-analysis-ik的码e码解办法,但是源s源我执行下来的效果只是将插件的源码下载下来,elasticsearch只是码e码解将其作为一个_site插件看待。
所以只有执行maven并将打包后的源s源jar文件拷贝到上级目录。(否则在定义mapping的码e码解flarum 源码学习analyzer的时候会提示找不到类的错误)。
由于IK是源s源基于字典的分词,所以还要下载IK的码e码解字典文件,在medcl的源s源elasticsearch-RTF中有,可以通过这个地址下载:
下载之后解压缩到config目录下。码e码解到这里,源s源你可能需要重新启动下elasticsearch,码e码解好让下一部定义的源s源分词器能立即生效。
二、码e码解分词定义
分词插件准备好之后就可以在elasticsearch里定义(声明)这个分词类型了(自带的源s源几个类型,比如standred则不需要特别定义)。跟其他设置一样,分词的定义也可以在系统级(elasticsearch全局范围),也可以在索引级(只在当前index内部可见)。系统级的定义当然是指在conf目录下的
elasticsearch.yml文件里定义,内容大致如下:
index:
analysis:
analyzer:
ikAnalyzer:
alias: [ik]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider
或者 index.analysis.analyzer.ik.type : "ik"
因为个人喜好,我并没有这么做, 而是定义在了需要使用中文分词的index中,这样定义更灵活,也不会影响其他index。
在定义analyze之前,先关闭index。其实并不需要关闭也可以生效,但是为了数据一致性考虑,还是先执行关闭。(如果是线上的系统需要三思)
curl -XPOST
(很显然,这里的application是我的一个index)
然后执行:
curl -XPUT localhost:/application/_settings -d '
{
"analysis": {
"analyzer":{
"ikAnalyzer":{
"type":"org.elasticsearch.index.analysis.IkAnalyzerProvider",
"alias":"ik"
}
}
}
}
'
打开index:
curl -XPOST
到此为止一个新的类型的分词器就定义好了,接下来就是要如何使用了
或者按如下配置
curl -XPUT localhost:/indexname -d '{
"settings" : {
"analysis" : {
"analyzer" : {
"ik" : {
"tokenizer" : "ik"
}
}
}
},
"mappings" : {
"article" : {
"dynamic" : true,
"properties" : {
"title" : {
"type" : "string",
"analyzer" : "ik"
}
}
}
}
}'
如果我们想返回最细粒度的分词结果,需要在elasticsearch.yml中配置如下:
index:
analysis:
analyzer:
ik:
alias: [ik_analyzer]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider
ik_smart:
type: ik
use_smart: true
ik_max_word:
type: ik
use_smart: false
三、使用分词器
在将分词器使用到实际数据之前,可以先测验下分词效果:
中文分词
分词结果是:
{
"tokens" : [ {
"token" : "中文",
"start_offset" : 0,
"end_offset" : 2,
"type" : "CN_WORD",
"position" : 1
}, {
"token" : "分词",
"start_offset" : 2,
"end_offset" : 4,
"type" : "CN_WORD",
"position" : 2
} ]
}
与使用standard分词器的效果更合理了:
{
"tokens" : [ {
"token" : "中",
"start_offset" : 0,
"end_offset" : 1,
"type" : "<IDEOGRAPHIC>",
"position" : 1
}, {
"token" : "文",
"start_offset" : 1,
"end_offset" : 2,
"type" : "<IDEOGRAPHIC>",
"position" : 2
}, {
"token" : "分",
"start_offset" : 2,
"end_offset" : 3,
"type" : "<IDEOGRAPHIC>",
"position" : 3
}, {
"token" : "词",
"start_offset" : 3,
"end_offset" : 4,
"type" : "<IDEOGRAPHIC>",
"position" : 4
} ]
}
新的分词器定义完成,工作正常后就可以在mapping的定义中引用了,比如我定义这样的type:
curl localhost:/application/article/_mapping -d '
{
"article": {
"properties": {
"description": {
"type": "string",
"indexAnalyzer":"ikAnalyzer",
"searchAnalyzer":"ikAnalyzer"
},
"title": {
"type": "string",
"indexAnalyzer":"ik",
"searchAnalyzer":"ik"
}
}
}
}
'
很遗憾,对于已经存在的index来说,要将一个string类型的field从standard的分词器改成别的分词器通常都是失败的:
{
"error": "MergeMappingException[Merge failed with failures { [mapper [description] has different index_analyzer, mapper [description] has
different search_analyzer]}]",
"status":
}
而且没有办法解决冲突,唯一的风险控制源码指标办法是新建一个索引,并制定mapping使用新的分词器(注意要在数据插入之前,否则会使用elasticsearch默认的分词器)
curl -XPUT localhost:/application/article/_mapping -d '
{
"article" : {
"properties" : {
"description": {
"type": "string",
"indexAnalyzer":"ikAnalyzer",
"searchAnalyzer":"ikAnalyzer"
},
"title": {
"type": "string",
"indexAnalyzer":"ik",
"searchAnalyzer":"ik"
}
}
}
}
至此,一个带中文分词的elasticsearch就算搭建完成。 想偷懒的可以下载medcl的elasticsearch-RTF直接使用,里面需要的插件和配置基本都已经设置好。
------------
标准分词(standard)配置如下:
curl -XPUT localhost:/local -d '{
"settings" : {
"analysis" : {
"analyzer" : {
"stem" : {
"tokenizer" : "standard",
"filter" : ["standard", "lowercase", "stop", "porter_stem"]
}
}
}
},
"mappings" : {
"article" : {
"dynamic" : true,
"properties" : {
"title" : {
"type" : "string",
"analyzer" : "stem"
}
}
}
}
}'
index:local
type:article
default analyzer:stem (filter:小写、停用词等)
field:title
测试:
# Sample Analysis
curl -XGET localhost:/local/_analyze?analyzer=stem -d '{ Fight for your life}'
curl -XGET localhost:/local/_analyze?analyzer=stem -d '{ Bruno fights Tyson tomorrow}'
# Index Data
curl -XPUT localhost:/local/article/1 -d'{ "title": "Fight for your life"}'
curl -XPUT localhost:/local/article/2 -d'{ "title": "Fighting for your life"}'
curl -XPUT localhost:/local/article/3 -d'{ "title": "My dad fought a dog"}'
curl -XPUT localhost:/local/article/4 -d'{ "title": "Bruno fights Tyson tomorrow"}'
# search on the title field, which is stemmed on index and search
curl -XGET localhost:/local/_search?q=title:fight
# searching on _all will not do anystemming, unless also configured on the mapping to be stemmed...
curl -XGET localhost:/local/_search?q=fight
例如:
Fight for your life
分词如下:
{ "tokens":[
{ "token":"fight","start_offset":1,"end_offset":6,"type":"<ALPHANUM>","position":1},<br>
{ "token":"your","start_offset":,"end_offset":,"type":"<ALPHANUM>","position":3},<br>
{ "token":"life","start_offset":,"end_offset":,"type":"<ALPHANUM>","position":4}
]}
-------------------另一篇--------------------
ElasticSearch安装ik分词插件
一、IK简介
IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从年月推出1.0版开始, IKAnalyzer已经推出了4个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开 始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在版本中,IK实现了简单的分词 歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。
IK Analyzer 特性:
1.采用了特有的逗正向迭代最细粒度切分算法逗,支持细粒度和智能分词两种切分模式;
2.在系统环境:Core2 i7 3.4G双核,4G内存,window 7 位, Sun JDK 1.6_ 位 普通pc环境测试,IK具有万字/秒(KB/S)的高速处理能力。
3.版本的智能分词模式支持简单的分词排歧义处理和数量词合并输出。
4.采用了多子处理器分析模式,支持:英文字母、数字、中文词汇等分词处理,兼容韩文、日文字符
5.优化的词典存储,更小的内存占用。支持用户词典扩展定义。特别的,在版本,词典支持中文,英文,安卓fpv源码数字混合词语。
二、安装IK分词插件
假设读者已经安装好ES,如果没有的话,请参考ElasticSearch入门 —— 集群搭建。安装IK分词需要的资源可以从这里下载,整个安装过程需要三个步骤:
1、获取分词的依赖包
通过git clone ,下载分词器源码,然后进入下载目录,执行命令:mvn clean package,打包生成elasticsearch-analysis-ik-1.2.5.jar。将这个jar拷贝到ES_HOME/plugins/analysis-ik目录下面,如果没有该目录,则先创建该目录。
2、ik目录拷贝
将下载目录中的ik目录拷贝到ES_HOME/config目录下面。
3、分词器配置
打开ES_HOME/config/elasticsearch.yml文件,在文件最后加入如下内容:
index:
analysis:
analyzer:
ik:
alias: [ik_analyzer]
type: org.elasticsearch.index.analysis.IkAnalyzerProvider
ik_max_word:
type: ik
use_smart: false
ik_smart:
type: ik
use_smart: true
或
index.analysis.analyzer.default.type: ik
ok!插件安装已经完成,请重新启动ES,接下来测试ik分词效果啦!
三、ik分词测试
1、创建一个索引,名为index。
curl -XPUT
2、为索引index创建mapping。
curl -XPOST /fulltext/_mapping -d'
{
"fulltext": {
"_all": {
"analyzer": "ik"
},
"properties": {
"content": {
"type" : "string",
"boost" : 8.0,
"term_vector" : "with_positions_offsets",
"analyzer" : "ik",
"include_in_all" : true
}
}
}
}'
3、测试
curl '/_analyze?analyzer=ik&pretty=true' -d '
{
"text":"世界如此之大"
}'
显示结果如下:
{
"tokens" : [ {
"token" : "text",
"start_offset" : 4,
"end_offset" : 8,
"type" : "ENGLISH",
"position" : 1
}, {
"token" : "世界",
"start_offset" : ,
"end_offset" : ,
"type" : "CN_WORD",
"position" : 2
}, {
"token" : "如此",
"start_offset" : ,
"end_offset" : ,
"type" : "CN_WORD",
"position" : 3
}, {
"token" : "之大",
"start_offset" : ,
"end_offset" : ,
"type" : "CN_WORD",
"position" : 4
} ]
}
手机怎么检查源代码
手机怎么检查源代码?
一、手机在检查源代码
1. 首先,打开手机,查找并点击进入设置。
2. 然后在打开的设置页面,点击进入更多。
3. 在打开的页中,点击进入about phone。
4. 在页面中,点进入版本信息。apk怎么转成源码
5. 最后,在打开的页面中,可以看到信息。
二、要如何操作?
1. 查看站点:搜书“查看网页源码”,有很多支持查看网页源码的在线站点。
2. 企鹅浏览器+es文件管理器:使用浏览器打开网页,长按,“保存离线网页”。打开文件管理器,打开路径“网页保存”,打开方式选择“ES文本阅读器”即可查看源码。
3. 手机浏览器:在要查看源码的网址前加“view:”即可。
源代码其实有很多种,不同的源代码运行的原件也不同,比如c语言编写的代码可以在Turbo c环境下编译,Java源码有很多工具可以运行,如eclipse、NetBeans等。
es lucene搜索及聚合流程源码分析
本文通过深入分析 TermQuery 和 GlobalOrdinalsStringTermsAggregator,旨在揭示 Elasticsearch 和 Lucene 的搜索及聚合流程。从协调节点接收到请求后,将搜索任务分配给相关索引的各个分片(shard)开始。 协调节点将请求转发至数据节点,数据节点负责查询与聚合单个分片的数据。 在数据节点中,根据请求构建 SearchContext,该上下文包含了查询(Query)和聚合(Aggregator)等关键信息。查询由请求创建,例如 TermQuery 用于文本和关键词字段,其索引结构为倒排索引;PointRangeQuery 用于数字、日期、IP 和点字段,其索引结构为 k-d tree。 构建 Aggregator 时,根据 SearchContext 创建具体聚合器,如 GlobalOrdinalsStringTermsAggregator 用于关键词字段的全局排序术语聚合。 在处理全局排序术语聚合时,如果缓存中不存在全局排序,将创建并缓存全局排序,分发源码搭建当分片下的数据发生变化时,需要清空缓存。 全局排序将所有分段中的指定字段的所有术语排序并合并成一个全局排序,同时创建一个 OrdinalMap,用于在收集时从分段 ord 获取全局 ord。 docCounts 用于记录 ord 对应的文档计数。 对于稀疏情况下的数据收集,使用 bucketOrds 来缩减 docCounts 的大小,并通过 LongHash 将全局 ord 与 id 映射起来,收集时在 id 处累加计数。 处理聚合数据时,根据请求创建具体的权重,用于查询分片并创建评分器。查询流程涉及从 FST(Finite State Transducer,有限状态传感器)中查找术语,读取相关文件并获取文档标识符集合。 评分及收集过程中,TopScoreDocCollector 用于为文档评分并获取顶级文档。聚合流程中,GlobalOrdinalsStringTermsAggregator 统计各术语的文档计数。 协调节点最终收集各个分片的返回结果,进行聚合处理,并获取数据,数据节点从存储字段中检索结果。在整个流程中,FetchPhase 使用查询 ID 获取搜索上下文,以防止合并后旧分段被删除。 本文提供了一个基于 Elasticsearch 和 Lucene 的搜索及聚合流程的深入分析,揭示了从请求接收、分片查询、聚合处理到数据收集和结果整合的全过程。通过理解这些关键组件和流程,开发者可以更深入地掌握 Elasticsearch 和 Lucene 的工作原理,优化搜索和聚合性能。ElasticSearch源码:数据类型
ElasticSearch源码版本 7.5.2,其底层基于Lucene,Lucene好比汽车的发动机,提供了基础的存储和查询功能,而ES则在此基础上增加了分布式特性。本文将简要探讨ES中的数据类型。
Lucene的FieldType是描述字段属性的核心,包含个属性,如倒排索引和DocValuesType,后者支持聚合排序。官方定义的类型如TextField,仅索引、分词但不存储,而用户可以根据需求自定义数据类型,尽管在ES中,所有数据类型都是自定义的。
Lucene文件格式类型各异,如Norms和Pre-Document Values,根据FieldType设置的不同属性,文件类型和存储结构会相应变化。Lucene通过不同的压缩类型和数据结构存储数据,但详细实现较为复杂。
在ES中,数据类型分为Meta-fields和Fields or properties。Meta-fields包括元数据字段如_index、_type和_id,它们存储在特定位置,但处理方式各异。Fields或properties则是开发的核心,包括String(text和keyword)、数字类型、Range类型、时间类型、Boolean和Binary等。
复杂数据类型如Object和Nested用于处理嵌套结构,而Geo-point和Geo-shape用于地理信息。特殊数据类型如IP、completion和Join则在特定场景下使用。Array要求数组内字段类型一致,Multi-fields则支持多种处理方式的字符串字段。
总体来说,ES的字段类型丰富且友好,但并非所有场景都适用。开发者在实际应用中应参考官方文档和代码来选择和使用。
参考资源:org.apache.lucene.codecs.lucene (Lucene 9.0.0核心API)、Elasticsearch Guide [7.5]、elastic.co/guide/en/ela...
centos怎么读 英语centos怎么读
1、CentOS官方发音是:[sent əu es]。
2、CentOS(Community Enterprise Operating System,中文意思是社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。
3、由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用。两者的不同,在于CentOS完全开源。
ElasticSearch源码:Shard Allocation与Rebalance(1)
ElasticSearch源码版本 7.5.2 遇到ES中未分配分片的情况时,特别是在大型集群中,处理起来会比较复杂。Master节点负责分片分配,通过调用allocationService.reroute方法执行分片分配,这是关键步骤。 在分布式系统中,诸如Kafka和ElasticSearch,平衡集群内的数据和分片分配是至关重要的。Kafka的leader replica负责数据读写,而ElasticSearch的主分片负责写入,副分片承担读取。如果集群内节点间的负载不平衡,会严重降低系统的健壮性和性能。主分片和副分片集中在某个节点的情况,一旦该节点异常,分布式系统的高可用性将不复存在。因此,分片的再平衡(rebalance)是必要的。 分片分配(Shard Allocation)是指将一个分片指定给集群中某个节点的过程。这一决策由主节点完成,涉及决定哪个分片分配到哪个节点,以及哪个分片为主分片或副分片。分片分配(Shard Allocation)
重要参数包括:cluster.routing.allocation.enable,该参数可以动态调整,控制分片的恢复和分配。重新启动节点时,此设置不会影响本地主分片的恢复。如果重新启动的节点具有未分配的主分片副本,则会立即恢复该主分片。触发条件
分片分配的触发条件通常与集群状态有关,具体细节在后续段落中展开。分片再平衡(Shard Rebalance)
重要参数包括:cluster.routing.rebalance.enable,用于控制整个集群的分片再平衡。再平衡的触发条件与集群分片数的变化有关,操作需要在业务低峰期进行,以减少对集群的影响。 再平衡策略的触发条件主要由以下几个参数控制:定义分配在节点的分片数的因子阈值。
定义分配在节点某个索引的分片数的因子阈值。
超出这个阈值时就会重新分配分片。
从逻辑角度和磁盘存储角度考虑,再平衡可确保集群中每个节点的分片数均衡,避免单节点负担过重。同时,确保索引的分片均匀分布,避免集中在某一分片。再平衡决策
再平衡决策涉及两个关键组件:分配器(allocator)和决策者(deciders)。 分配器负责寻找最优节点进行分片分配,通过将拥有分片数量最少的节点列表按分片数量递增排序。对于新建索引,分配器的目标是以均衡方式将新索引的分片分配给集群节点。 决策者依次遍历分配器提供的节点列表,判断是否分配分片,考虑分配过滤规则和是否超过节点磁盘容量阈值等因素。手动执行再平衡
客户端可以通过发起POST请求到/_cluster/reroute来执行再平衡操作。此操作在服务端解析为两个命令,分别对应分片移动和副本分配。内部模块执行再平衡
ES内部在触发分片分配时会调用AllocationService的reroute方法来执行再平衡。总结
无论是手动执行再平衡命令还是ES内部自动执行,最终都会调用reroute方法来实现分片的再平衡。再平衡操作涉及两种主要分配器(GatewayAllocator和ShardsAllocator),每种分配器都有不同的实现策略,以优化分配过程。决策者(Deciders)在再平衡过程中起关键作用,确保决策符合集群状态和性能要求。再平衡策略和决策机制确保了ElasticSearch集群的高效和稳定运行。Spark Core读取ES的分区问题分析
撰写本文的初衷是因近期一位星球球友面试时,面试官询问了Spark分析ES数据时,生成的RDD分区数与哪些因素相关。
初步推测,这与分片数有关,但具体关系是什么呢?以下是两种可能的关系:
1).类似于KafkaRDD的分区与kafka topic分区数的关系,一对一。
2).ES支持游标查询,那么是否可以对较大的ES索引分片进行拆分,形成多个RDD分区呢?
下面,我将与大家共同探讨源码,了解具体情况。
1.Spark Core读取ES
ES官网提供了elasticsearch-hadoop插件,对于ES 7.x,hadoop和Spark版本的支持如下:
在此,我使用的ES版本为7.1.1,测试用的Spark版本为2.3.1,没有问题。整合es和spark,导入相关依赖有两种方式:
a,导入整个elasticsearch-hadoop包
b,仅导入spark模块的包
为了方便测试,我在本机启动了一个单节点的ES实例,简单的测试代码如下:
可以看到,Spark Core读取RDD主要有两种形式的API:
a,esRDD。这种返回的是一个tuple2类型的RDD,第一个元素是id,第二个是一个map,包含ES的document元素。
b,esJsonRDD。这种返回的也是一个tuple2类型的RDD,第一个元素依然是id,第二个是json字符串。
尽管这两种RDD的类型不同,但它们都是ScalaEsRDD类型。
要分析Spark Core读取ES的并行度,只需分析ScalaEsRDD的getPartitions函数。
2.源码分析
首先,导入源码github.com/elastic/elasticsearch-hadoop这个gradle工程,可以直接导入idea,然后切换到7.x版本。
接下来,找到ScalaEsRDD,发现getPartitions方法是在其父类中实现的,方法内容如下:
esPartitions是一个lazy型的变量:
这种声明的原因是什么呢?
lazy+transient的原因大家可以思考一下。
RestService.findPartitions方法只是创建客户端获取分片等信息,然后调用,分两种情况调用两个方法:
a).findSlicePartitions
这个方法实际上是在5.x及以后的ES版本,同时配置了
之后,才会执行。实际上就是将ES的分片按照指定大小进行拆分,必然要先进行分片大小统计,然后计算出拆分的分区数,最后生成分区信息。具体代码如下:
实际上,分片就是通过游标方式,对_doc进行排序,然后按照分片计算得到的分区偏移进行数据读取,组装过程是通过SearchRequestBuilder.assemble方法实现的。
这个实际上会浪费一定的性能,如果真的要将ES与Spark结合,建议合理设置分片数。
b).findShardPartitions方法
这个方法没有疑问,一个RDD分区对应于ES index的一个分片。
3.总结
以上就是Spark Core读取ES数据时,分片和RDD分区的对应关系分析。默认情况下,一个ES索引分片对应Spark RDD的一个分区。如果分片数过大,且ES版本在5.x及以上,可以配置参数
进行拆分。