Hello,World

Lucene5.5入门第三篇——Lucene索引文件结构

Lucene的索引结构是有层次结构的,主要分以下几个层次:



索引(Index):
在Lucene中一个索引是放在一个文件夹中的。
如上图,同一文件夹中的所有的文件构成一个Lucene索引。
段(Segment):
一个索引可以包含多个段,段与段之间是独立的,添加新文档可以生成新的段,不同的段可以合并。
如上图,具有相同前缀文件的属同一个段,图中共三个段 "_0" 和 "_1"和“_2”。
segments.gen和segments_X是段的元数据文件,也即它们保存了段的属性信息。
文档(Document):
文档是我们建索引的基本单位,不同的文档是保存在不同的段中的,一个段可以包含多篇文档。
新添加的文档是单独保存在一个新生成的段中,随着段的合并,不同的文档合并到同一个段中。
域(Field):
一篇文档包含不同类型的信息,可以分开索引,比如标题,时间,正文,作者等,都可以保存在不同的域里。
不同域的索引方式可以不同,在真正解析域的存储的时候,我们会详细解读。
词(Term):
词是索引的最小单位,是经过词法分析和语言处理后的字符串。
更多对应的文件后缀

名称
文件拓展名
描述
段文件
segments_N 保存了索引包含的多少段,每个段包含多少文档。
段元数据
.si 保存了索引段的元数据信息
锁文件
write.lock 防止多个IndexWriter同时写到一份索引文件中。
复合索引文件
.cfs, .cfe 把所有索引信息都存储到复合索引文件中。
索引段的域信息
.fnm
保存此段包含的域,以及域的名称和域的索引类型。
索引段的文档信息
.fdx, .fdt
保存此段包含的文档,每篇文档中包含的域以及每个域的信息。

索引段Term信息
.tim, .tip
.tim文件中存储着每个域中Term的统计信息且保存着指向.doc, .pos, and .pay 索引文件的指针。

.tip文件保存着Term 字典的索引信息,可支持随机访问。

文档中Term词频和跳表信息
.doc
保存此段中每个文档对应的Term频率信息。
文档中Term的位置信息
.pos
保存此段中每个文档对应的Term位置信息。
文档的有效载荷和部分位置信息
.pay
保存此段中每个文档的有效载体(payload) 和 Term的位置信息(offsets)。 其中有一部分的Term位置信息存储在.pos文件中。
索引字段加权因子
.nvd, .nvm
.nvm 文件保存索引字段加权因子的元数据

.nvd 文件保存索引字段加权数据

索引文档加权因子
.dvd, .dvm
.dvm 文件保存索引文档加权因子的元数据

.dvd 文件保存索引文档加权数据

索引矢量数据
.tvx, .tvd, .tvf
.tvd 存储此段文档的Term、Term频率、位置信息、有效载荷等信息。

.tvx 索引文件,用于把特定的文档加载到内存。

.tvf 保存索引字段的矢量信息。

有效文档
.liv
保存有效文档的索引文件信息
Lucene的索引结构中,即保存了正向信息,也保存了反向信息。

所谓正向信息:

按层次保存了从索引,一直到词的包含关系:索引(Index) –> 段(segment) –> 文档(Document) –> 域(Field) –> 词(Term)
也即此索引包含了那些段,每个段包含了那些文档,每个文档包含了那些域,每个域包含了那些词。
既然是层次结构,则每个层次都保存了本层次的信息以及下一层次的元信息,也即属性信息,比如一本介绍中国地理的书,应该首先介绍中国地理的概况, 以及中国包含多少个省,每个省介绍本省的基本概况及包含多少个市,每个市介绍本市的基本概况及包含多少个县,每个县具体介绍每个县的具体情况。
如上图,包含正向信息的文件有:
segments_N保存了此索引包含多少个段,每个段包含多少篇文档。
XXX.fnm保存了此段包含了多少个域,每个域的名称及索引方式。
XXX.fdx,XXX.fdt保存了此段包含的所有文档,每篇文档包含了多少域,每个域保存了那些信息。
XXX.tvx,XXX.tvd,XXX.tvf保存了此段包含多少文档,每篇文档包含了多少域,每个域包含了多少词,每个词的字符串,位置等信息。
所谓反向信息:

保存了词典到倒排表的映射:词(Term) –> 文档(Document)
如上图,包含反向信息的文件有:
XXX.tis,XXX.tii保存了词典(Term Dictionary),也即此段包含的所有的词按字典顺序的排序。
XXX.frq保存了倒排表,也即包含每个词的文档ID列表。
XXX.prx保存了倒排表中每个词在包含此词的文档中的位置。
在了解Lucene索引的详细结构之前,先看看Lucene索引中的基本数据类型。


二、基本类型

Lucene索引文件中,用以下基本类型来保存信息:

Byte:是最基本的类型,长8位(bit)。
UInt32:由4个Byte组成。
UInt64:由8个Byte组成。
VInt:
变长的整数类型,它可能包含多个Byte,对于每个Byte的8位,其中后7位表示数值,最高1位表示是否还有另一个Byte,0表示没有,1表示有。
越前面的Byte表示数值的低位,越后面的Byte表示数值的高位。
例如130化为二进制为 1000, 0010,总共需要8位,一个Byte表示不了,因而需要两个Byte来表示,第一个Byte表示后7位,并且在最高位置1来表示后面还有一个Byte, 所以为(1) 0000010,第二个Byte表示第8位,并且最高位置0来表示后面没有其他的Byte了,所以为(0) 0000001。




Chars:是UTF-8编码的一系列Byte。
String:一个字符串首先是一个VInt来表示此字符串包含的字符的个数,接着便是UTF-8编码的字符序列Chars。

三、基本规则

Lucene为了使的信息的存储占用的空间更小,访问速度更快,采取了一些特殊的技巧,然而在看Lucene文件格式的时候,这些技巧却容易使我们感到困惑,所以有必要把这些特殊的技巧规则提取出来介绍一下。

在下不才,胡乱给这些规则起了一些名字,是为了方便后面应用这些规则的时候能够简单,不妥之处请大家谅解。

1. 前缀后缀规则(PREFIX+SUFFIX)

Lucene在反向索引中,要保存词典(Term Dictionary)的信息,所有的词(Term)在词典中是按照字典顺序进行排列的,然而词典中包含了文档中的几乎所有的词,并且有的词还是非常的长 的,这样索引文件会非常的大,所谓前缀后缀规则,即当某个词和前一个词有共同的前缀的时候,后面的词仅仅保存前缀在词中的偏移(offset),以及除前 缀以外的字符串(称为后缀)。

[图]前缀后缀规则



比如要存储如下词:term,termagancy,termagant,terminal,

如果按照正常方式来存储,需要的空间如下:

[VInt = 4] [t][e][r][m],[VInt = 10][t][e][r][m][a][g][a][n][c][y],[VInt = 9][t][e][r][m][a][g][a][n][t],[VInt = 8][t][e][r][m][i][n][a][l]

共需要35个Byte.

如果应用前缀后缀规则,需要的空间如下:

[VInt = 4] [t][e][r][m],[VInt = 4 (offset)][VInt = 6][a][g][a][n][c][y],[VInt = 8 (offset)][VInt = 1][t],[VInt = 4(offset)][VInt = 4][i][n][a][l]

共需要22个Byte。

大大缩小了存储空间,尤其是在按字典顺序排序的情况下,前缀的重合率大大提高。

2. 差值规则(DELTA)

在Lucene的反向索引中,需要保存很多整型数字的信息,比如文档ID号,比如词(Term)在文档中的位置等等。

由上面介绍,我们知道,整型数字是以VInt的格式存储的。随着数值的增大,每个数字占用的Byte的个数也逐渐的增多。所谓差值规则(Delta)就是先后保存两个整数的时候,后面的整数仅仅保存和前面整数的差即可。

[图]差值规则



比如要存储如下整数:16386,16387,16388,16389

如果按照正常方式来存储,需要的空间如下:

[(1) 000, 0010][(1) 000, 0000][(0) 000, 0001],[(1) 000, 0011][(1) 000, 0000][(0) 000, 0001],[(1) 000, 0100][(1) 000, 0000][(0) 000, 0001],[(1) 000, 0101][(1) 000, 0000][(0) 000, 0001]

供需12个Byte。

如果应用差值规则来存储,需要的空间如下:

[(1) 000, 0010][(1) 000, 0000][(0) 000, 0001],[(0) 000, 0001],[(0) 000, 0001],[(0) 000, 0001]

共需6个Byte。

大大缩小了存储空间,而且无论是文档ID,还是词在文档中的位置,都是按从小到大的顺序,逐渐增大的。

3. 或然跟随规则(A, B?)

Lucene的索引结构中存在这样的情况,某个值A后面可能存在某个值B,也可能不存在,需要一个标志来表示后面是否跟随着B。

一般的情况下,在A后面放置一个Byte,为0则后面不存在B,为1则后面存在B,或者0则后面存在B,1则后面不存在B。

但这样要浪费一个Byte的空间,其实一个Bit就可以了。

在Lucene中,采取以下的方式:A的值左移一位,空出最后一位,作为标志位,来表示后面是否跟随B,所以在这种情况下,A/2是真正的A原来的值。





如果去读Apache Lucene - Index File Formats这篇文章,会发现很多符合这种规则的:

.frq文件中的DocDelta[, Freq?],DocSkip,PayloadLength?
.prx文件中的PositionDelta,Payload? (但不完全是,如下表分析)
当然还有一些带?的但不属于此规则的:

.frq文件中的SkipChildLevelPointer?,是多层跳跃表中,指向下一层表的指针,当然如果是最后一层,此值就不存在,也不需要标志。
.tvf文件中的Positions?, Offsets?。
在此类情况下,带?的值是否存在,并不取决于前面的值的最后一位。
而是取决于Lucene的某项配置,当然这些配置也是保存在Lucene索引文件中的。
如Position和Offset是否存储,取决于.fnm文件中对于每个域的配置(TermVector.WITH_POSITIONS和TermVector.WITH_OFFSETS)
为什么会存在以上两种情况,其实是可以理解的:

对于符合或然跟随规则的,是因为对于每一个A,B是否存在都不相同,当这种情况大量存在的时候,从一个Byte到一个Bit如此8倍的空间节约还是很值得的。
对于不符合或然跟随规则的,是因为某个值的是否存在的配置对于整个域(Field)甚至整个索引都是有效的,而非每次的情况都不相同,因而可以统一存放一个标志。
文章中对如下格式的描述令人困惑:
Positions --> Freq
Payload -->
PositionDelta和Payload是否适用或然跟随规则呢?如何标识PayloadLength是否存在呢?
其实PositionDelta和Payload并不符合或然跟随规则,Payload是否存在,是由.fnm文件中对于每个域的配置中有关Payload的配置决定的(FieldOption.STORES_PAYLOADS) 。
当Payload不存在时,PayloadDelta本身不遵从或然跟随原则。
当Payload存在时,格式应该变成如下:Positions --> Freq
从而PositionDelta和PayloadLength一起适用或然跟随规则。

4. 跳跃表规则(SKIP LIST)

为了提高查找的性能,Lucene在很多地方采取的跳跃表的数据结构。

跳跃表(Skip List)是如图的一种数据结构,有以下几个基本特征:

元素是按顺序排列的,在Lucene中,或是按字典顺序排列,或是按从小到大顺序排列。
跳跃是有间隔的(Interval),也即每次跳跃的元素数,间隔是事先配置好的,如图跳跃表的间隔为3。
跳跃表是由层次的(level),每一层的每隔指定间隔的元素构成上一层,如图跳跃表共有2层。




需要注意一点的是,在很多数据结构或算法书中都会有跳跃表的描述,原理都是大致相同的,但是定义稍有差别:

对间隔(Interval)的定义: 如图中,有的认为间隔为2,即两个上层元素之间的元素数,不包括两个上层元素;有的认为是3,即两个上层元素之间的差,包括后面上层元素,不包括前面的上 层元素;有的认为是4,即除两个上层元素之间的元素外,既包括前面,也包括后面的上层元素。Lucene是采取的第二种定义。
对层次(Level)的定义:如图中,有的认为应该包括原链表层,并从1开始计数,则总层次为3,为1,2,3层;有的认为应该包括原链表层,并 从0计数,为0,1,2层;有的认为不应该包括原链表层,且从1开始计数,则为1,2层;有的认为不应该包括链表层,且从0开始计数,则为0,1层。 Lucene采取的是最后一种定义。
跳跃表比顺序查找,大大提高了查找速度,如查找元素72,原来要访问2,3,7,12,23,37,39,44,50,72总共10个元素,应用跳 跃表后,只要首先访问第1层的50,发现72大于50,而第1层无下一个节点,然后访问第2层的94,发现94大于72,然后访问原链表的72,找到元 素,共需要访问3个元素即可。

然而Lucene在具体实现上,与理论又有所不同,在具体的格式中,会详细说明。

原文地址:http://www.kailing.pub/article/index/arcid/73.html
继续阅读 »
Lucene的索引结构是有层次结构的,主要分以下几个层次:



索引(Index):
在Lucene中一个索引是放在一个文件夹中的。
如上图,同一文件夹中的所有的文件构成一个Lucene索引。
段(Segment):
一个索引可以包含多个段,段与段之间是独立的,添加新文档可以生成新的段,不同的段可以合并。
如上图,具有相同前缀文件的属同一个段,图中共三个段 "_0" 和 "_1"和“_2”。
segments.gen和segments_X是段的元数据文件,也即它们保存了段的属性信息。
文档(Document):
文档是我们建索引的基本单位,不同的文档是保存在不同的段中的,一个段可以包含多篇文档。
新添加的文档是单独保存在一个新生成的段中,随着段的合并,不同的文档合并到同一个段中。
域(Field):
一篇文档包含不同类型的信息,可以分开索引,比如标题,时间,正文,作者等,都可以保存在不同的域里。
不同域的索引方式可以不同,在真正解析域的存储的时候,我们会详细解读。
词(Term):
词是索引的最小单位,是经过词法分析和语言处理后的字符串。
更多对应的文件后缀

名称
文件拓展名
描述
段文件
segments_N 保存了索引包含的多少段,每个段包含多少文档。
段元数据
.si 保存了索引段的元数据信息
锁文件
write.lock 防止多个IndexWriter同时写到一份索引文件中。
复合索引文件
.cfs, .cfe 把所有索引信息都存储到复合索引文件中。
索引段的域信息
.fnm
保存此段包含的域,以及域的名称和域的索引类型。
索引段的文档信息
.fdx, .fdt
保存此段包含的文档,每篇文档中包含的域以及每个域的信息。

索引段Term信息
.tim, .tip
.tim文件中存储着每个域中Term的统计信息且保存着指向.doc, .pos, and .pay 索引文件的指针。

.tip文件保存着Term 字典的索引信息,可支持随机访问。

文档中Term词频和跳表信息
.doc
保存此段中每个文档对应的Term频率信息。
文档中Term的位置信息
.pos
保存此段中每个文档对应的Term位置信息。
文档的有效载荷和部分位置信息
.pay
保存此段中每个文档的有效载体(payload) 和 Term的位置信息(offsets)。 其中有一部分的Term位置信息存储在.pos文件中。
索引字段加权因子
.nvd, .nvm
.nvm 文件保存索引字段加权因子的元数据

.nvd 文件保存索引字段加权数据

索引文档加权因子
.dvd, .dvm
.dvm 文件保存索引文档加权因子的元数据

.dvd 文件保存索引文档加权数据

索引矢量数据
.tvx, .tvd, .tvf
.tvd 存储此段文档的Term、Term频率、位置信息、有效载荷等信息。

.tvx 索引文件,用于把特定的文档加载到内存。

.tvf 保存索引字段的矢量信息。

有效文档
.liv
保存有效文档的索引文件信息
Lucene的索引结构中,即保存了正向信息,也保存了反向信息。

所谓正向信息:

按层次保存了从索引,一直到词的包含关系:索引(Index) –> 段(segment) –> 文档(Document) –> 域(Field) –> 词(Term)
也即此索引包含了那些段,每个段包含了那些文档,每个文档包含了那些域,每个域包含了那些词。
既然是层次结构,则每个层次都保存了本层次的信息以及下一层次的元信息,也即属性信息,比如一本介绍中国地理的书,应该首先介绍中国地理的概况, 以及中国包含多少个省,每个省介绍本省的基本概况及包含多少个市,每个市介绍本市的基本概况及包含多少个县,每个县具体介绍每个县的具体情况。
如上图,包含正向信息的文件有:
segments_N保存了此索引包含多少个段,每个段包含多少篇文档。
XXX.fnm保存了此段包含了多少个域,每个域的名称及索引方式。
XXX.fdx,XXX.fdt保存了此段包含的所有文档,每篇文档包含了多少域,每个域保存了那些信息。
XXX.tvx,XXX.tvd,XXX.tvf保存了此段包含多少文档,每篇文档包含了多少域,每个域包含了多少词,每个词的字符串,位置等信息。
所谓反向信息:

保存了词典到倒排表的映射:词(Term) –> 文档(Document)
如上图,包含反向信息的文件有:
XXX.tis,XXX.tii保存了词典(Term Dictionary),也即此段包含的所有的词按字典顺序的排序。
XXX.frq保存了倒排表,也即包含每个词的文档ID列表。
XXX.prx保存了倒排表中每个词在包含此词的文档中的位置。
在了解Lucene索引的详细结构之前,先看看Lucene索引中的基本数据类型。


二、基本类型

Lucene索引文件中,用以下基本类型来保存信息:

Byte:是最基本的类型,长8位(bit)。
UInt32:由4个Byte组成。
UInt64:由8个Byte组成。
VInt:
变长的整数类型,它可能包含多个Byte,对于每个Byte的8位,其中后7位表示数值,最高1位表示是否还有另一个Byte,0表示没有,1表示有。
越前面的Byte表示数值的低位,越后面的Byte表示数值的高位。
例如130化为二进制为 1000, 0010,总共需要8位,一个Byte表示不了,因而需要两个Byte来表示,第一个Byte表示后7位,并且在最高位置1来表示后面还有一个Byte, 所以为(1) 0000010,第二个Byte表示第8位,并且最高位置0来表示后面没有其他的Byte了,所以为(0) 0000001。




Chars:是UTF-8编码的一系列Byte。
String:一个字符串首先是一个VInt来表示此字符串包含的字符的个数,接着便是UTF-8编码的字符序列Chars。

三、基本规则

Lucene为了使的信息的存储占用的空间更小,访问速度更快,采取了一些特殊的技巧,然而在看Lucene文件格式的时候,这些技巧却容易使我们感到困惑,所以有必要把这些特殊的技巧规则提取出来介绍一下。

在下不才,胡乱给这些规则起了一些名字,是为了方便后面应用这些规则的时候能够简单,不妥之处请大家谅解。

1. 前缀后缀规则(PREFIX+SUFFIX)

Lucene在反向索引中,要保存词典(Term Dictionary)的信息,所有的词(Term)在词典中是按照字典顺序进行排列的,然而词典中包含了文档中的几乎所有的词,并且有的词还是非常的长 的,这样索引文件会非常的大,所谓前缀后缀规则,即当某个词和前一个词有共同的前缀的时候,后面的词仅仅保存前缀在词中的偏移(offset),以及除前 缀以外的字符串(称为后缀)。

[图]前缀后缀规则



比如要存储如下词:term,termagancy,termagant,terminal,

如果按照正常方式来存储,需要的空间如下:

[VInt = 4] [t][e][r][m],[VInt = 10][t][e][r][m][a][g][a][n][c][y],[VInt = 9][t][e][r][m][a][g][a][n][t],[VInt = 8][t][e][r][m][i][n][a][l]

共需要35个Byte.

如果应用前缀后缀规则,需要的空间如下:

[VInt = 4] [t][e][r][m],[VInt = 4 (offset)][VInt = 6][a][g][a][n][c][y],[VInt = 8 (offset)][VInt = 1][t],[VInt = 4(offset)][VInt = 4][i][n][a][l]

共需要22个Byte。

大大缩小了存储空间,尤其是在按字典顺序排序的情况下,前缀的重合率大大提高。

2. 差值规则(DELTA)

在Lucene的反向索引中,需要保存很多整型数字的信息,比如文档ID号,比如词(Term)在文档中的位置等等。

由上面介绍,我们知道,整型数字是以VInt的格式存储的。随着数值的增大,每个数字占用的Byte的个数也逐渐的增多。所谓差值规则(Delta)就是先后保存两个整数的时候,后面的整数仅仅保存和前面整数的差即可。

[图]差值规则



比如要存储如下整数:16386,16387,16388,16389

如果按照正常方式来存储,需要的空间如下:

[(1) 000, 0010][(1) 000, 0000][(0) 000, 0001],[(1) 000, 0011][(1) 000, 0000][(0) 000, 0001],[(1) 000, 0100][(1) 000, 0000][(0) 000, 0001],[(1) 000, 0101][(1) 000, 0000][(0) 000, 0001]

供需12个Byte。

如果应用差值规则来存储,需要的空间如下:

[(1) 000, 0010][(1) 000, 0000][(0) 000, 0001],[(0) 000, 0001],[(0) 000, 0001],[(0) 000, 0001]

共需6个Byte。

大大缩小了存储空间,而且无论是文档ID,还是词在文档中的位置,都是按从小到大的顺序,逐渐增大的。

3. 或然跟随规则(A, B?)

Lucene的索引结构中存在这样的情况,某个值A后面可能存在某个值B,也可能不存在,需要一个标志来表示后面是否跟随着B。

一般的情况下,在A后面放置一个Byte,为0则后面不存在B,为1则后面存在B,或者0则后面存在B,1则后面不存在B。

但这样要浪费一个Byte的空间,其实一个Bit就可以了。

在Lucene中,采取以下的方式:A的值左移一位,空出最后一位,作为标志位,来表示后面是否跟随B,所以在这种情况下,A/2是真正的A原来的值。





如果去读Apache Lucene - Index File Formats这篇文章,会发现很多符合这种规则的:

.frq文件中的DocDelta[, Freq?],DocSkip,PayloadLength?
.prx文件中的PositionDelta,Payload? (但不完全是,如下表分析)
当然还有一些带?的但不属于此规则的:

.frq文件中的SkipChildLevelPointer?,是多层跳跃表中,指向下一层表的指针,当然如果是最后一层,此值就不存在,也不需要标志。
.tvf文件中的Positions?, Offsets?。
在此类情况下,带?的值是否存在,并不取决于前面的值的最后一位。
而是取决于Lucene的某项配置,当然这些配置也是保存在Lucene索引文件中的。
如Position和Offset是否存储,取决于.fnm文件中对于每个域的配置(TermVector.WITH_POSITIONS和TermVector.WITH_OFFSETS)
为什么会存在以上两种情况,其实是可以理解的:

对于符合或然跟随规则的,是因为对于每一个A,B是否存在都不相同,当这种情况大量存在的时候,从一个Byte到一个Bit如此8倍的空间节约还是很值得的。
对于不符合或然跟随规则的,是因为某个值的是否存在的配置对于整个域(Field)甚至整个索引都是有效的,而非每次的情况都不相同,因而可以统一存放一个标志。
文章中对如下格式的描述令人困惑:
Positions --> Freq
Payload -->
PositionDelta和Payload是否适用或然跟随规则呢?如何标识PayloadLength是否存在呢?
其实PositionDelta和Payload并不符合或然跟随规则,Payload是否存在,是由.fnm文件中对于每个域的配置中有关Payload的配置决定的(FieldOption.STORES_PAYLOADS) 。
当Payload不存在时,PayloadDelta本身不遵从或然跟随原则。
当Payload存在时,格式应该变成如下:Positions --> Freq
从而PositionDelta和PayloadLength一起适用或然跟随规则。

4. 跳跃表规则(SKIP LIST)

为了提高查找的性能,Lucene在很多地方采取的跳跃表的数据结构。

跳跃表(Skip List)是如图的一种数据结构,有以下几个基本特征:

元素是按顺序排列的,在Lucene中,或是按字典顺序排列,或是按从小到大顺序排列。
跳跃是有间隔的(Interval),也即每次跳跃的元素数,间隔是事先配置好的,如图跳跃表的间隔为3。
跳跃表是由层次的(level),每一层的每隔指定间隔的元素构成上一层,如图跳跃表共有2层。




需要注意一点的是,在很多数据结构或算法书中都会有跳跃表的描述,原理都是大致相同的,但是定义稍有差别:

对间隔(Interval)的定义: 如图中,有的认为间隔为2,即两个上层元素之间的元素数,不包括两个上层元素;有的认为是3,即两个上层元素之间的差,包括后面上层元素,不包括前面的上 层元素;有的认为是4,即除两个上层元素之间的元素外,既包括前面,也包括后面的上层元素。Lucene是采取的第二种定义。
对层次(Level)的定义:如图中,有的认为应该包括原链表层,并从1开始计数,则总层次为3,为1,2,3层;有的认为应该包括原链表层,并 从0计数,为0,1,2层;有的认为不应该包括原链表层,且从1开始计数,则为1,2层;有的认为不应该包括链表层,且从0开始计数,则为0,1层。 Lucene采取的是最后一种定义。
跳跃表比顺序查找,大大提高了查找速度,如查找元素72,原来要访问2,3,7,12,23,37,39,44,50,72总共10个元素,应用跳 跃表后,只要首先访问第1层的50,发现72大于50,而第1层无下一个节点,然后访问第2层的94,发现94大于72,然后访问原链表的72,找到元 素,共需要访问3个元素即可。

然而Lucene在具体实现上,与理论又有所不同,在具体的格式中,会详细说明。

原文地址:http://www.kailing.pub/article/index/arcid/73.html
收起阅读 »

Lucene5.5入门第二篇——Lucene全文检索的基本原理

前言

上一篇博文,笔者相当于了解了Lucene是干嘛的,然后写了个hello World增进下对Lucene的感觉。个人觉得,学习一个新的东西时,首先从demo入手,能增加你对这个技术的兴趣,然后慢慢的深入其中的原理,就会有种拨开乌云见明月的感觉。当然,有的人喜欢从原理入手,这个见仁见智。总结来说,不管从哪里入手,对一门新的技术而言总归要知道其所有然

正文


Lucene是一个高效的,基于Java的全文检索库。

所以在了解Lucene之前要费一番工夫了解一下全文检索。

那么什么叫做全文检索呢?这要从我们生活中的数据说起。

我们生活中的数据总体分为两种:结构化数据和非结构化数据。

结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。
非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等。
当然有的地方还会提到第三种,半结构化数据,如XML,HTML等,当根据需要可按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。

非结构化数据又一种叫法叫全文数据。


按照数据的分类,搜索也分为两种:

对结构化数据的搜索:如对数据库的搜索,用SQL语句。再如对元数据的搜索,如利用windows搜索对文件名,类型,修改时间进行搜索等。
对非结构化数据的搜索:如利用windows的搜索也可以搜索文件内容,Linux下的grep命令,再如用Google和百度可以搜索大量内容数据。
对非结构化数据也即对全文数据的搜索主要有两种方法:

一种是顺序扫描法(Serial Scanning):所谓顺序扫描,比如 要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下 一个文件,直到扫描完所有的文件。如利用windows的搜索也可以搜索文件内容,只是相当的慢。如果你有一个80G硬盘,如果想在上面找到一个内容包含 某字符串的文件,不花他几个小时,怕是做不到。Linux下的grep命令也是这一种方式。大家可能觉得这种方法比较原始,但对于小数据量的文件,这种方 法还是最直接,最方便的。但是对于大量的文件,这种方法就很慢了。

有人可能会说,对非结构化数据顺序扫描很慢,对结构化数据的搜索却相对较快(由于结构化数据有一定的结构可以采取一定的搜索算法加快速度),那么把我们的非结构化数据想办法弄得有一定结构不就行了吗?

这种想法很天然,却构成了全文检索的基本思路,也即将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。

这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。

这种说法比较抽象,举几个例子就很容易明白,比如字典,字典的拼音表和部首检字表就相当于字典的索引,对每一个字的解释是非结构化的,如果字典没有 音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵母,分别只有 几种可以一一列举,于是将读音拿出来按一定的顺序排列,每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音,然后按其指向的页数, 便可找到我们的非结构化数据——也即对字的解释。


这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。
全文检索大体分两个过程,索引创建(Indexing)和搜索索引(Search)。

索引创建:将现实世界中所有的结构化和非结构化数据提取信息,创建索引的过程。
搜索索引:就是得到用户的查询请求,搜索创建的索引,然后返回结果的过程。
于是全文检索就存在三个重要问题:

1. 索引里面究竟存些什么?(Index)

2. 如何创建索引?(Indexing)

3. 如何对索引进行搜索?(Search)

下面我们顺序对每个个问题进行研究。


二、索引里面究竟存些什么

索引里面究竟需要存些什么呢?

首先我们来看为什么顺序扫描的速度慢:

其实是由于我们想要搜索的信息和非结构化数据中所存储的信息不一致造成的。

非结构化数据中所存储的信息是每个文件包含哪些字符串,也即已知文件,欲求字符串相对容易,也即是从文件到字符串的映射。而我们想搜索的信息是哪些 文件包含此字符串,也即已知字符串,欲求文件,也即从字符串到文件的映射。两者恰恰相反。于是如果索引总能够保存从字符串到文件的映射,则会大大提高搜索 速度。

由于从字符串到文件的映射是文件到字符串映射的反向过程,于是保存这种信息的索引称为反向索引。

反向索引的所保存的信息一般如下:

假设我的文档集合里面有100篇文档,为了方便表示,我们为文档编号从1到100,得到下面的结构

Lucene全文检索的基本原理

左边保存的是一系列字符串,称为词典。

每个字符串都指向包含此字符串的文档(Document)链表,此文档链表称为倒排表(Posting List)。

有了索引,便使保存的信息和要搜索的信息一致,可以大大加快搜索的速度。

比如说,我们要寻找既包含字符串“lucene”又包含字符串“solr”的文档,我们只需要以下几步:

1. 取出包含字符串“lucene”的文档链表。

2. 取出包含字符串“solr”的文档链表。

3. 通过合并链表,找出既包含“lucene”又包含“solr”的文件。

Lucene全文检索的基本原理

看到这个地方,有人可能会说,全文检索的确加快了搜索的速度,但是多了索引的过程,两者加起来不一定比顺序扫描快多少。的确,加上索引的过程,全文检索不一定比顺序扫描快,尤其是在数据量小的时候更是如此。而对一个很大量的数据创建索引也是一个很慢的过程。

然而两者还是有区别的,顺序扫描是每次都要扫描,而创建索引的过程仅仅需要一次,以后便是一劳永逸的了,每次搜索,创建索引的过程不必经过,仅仅搜索创建好的索引就可以了。

这也是全文搜索相对于顺序扫描的优势之一:一次索引,多次使用。


三、如何创建索引

全文检索的索引创建过程一般有以下几步:

第一步:一些要索引的原文档(DOCUMENT)。

为了方便说明索引创建过程,这里特意用两个文件为例:

文件一:Students should be allowed to go out with their friends, but not allowed to drink beer.

文件二:My friend Jerry went to school to see his students but found them drunk which is not allowed.


第二步:将原文档传给分次组件(TOKENIZER)。

分词组件(Tokenizer)会做以下几件事情(此过程称为Tokenize):

1. 将文档分成一个一个单独的单词。

2. 去除标点符号。

3. 去除停词(Stop word)。

所谓停词(Stop word)就是一种语言中最普通的一些单词,由于没有特别的意义,因而大多数情况下不能成为搜索的关键词,因而创建索引时,这种词会被去掉而减少索引的大小。

英语中挺词(Stop word)如:“the”,“a”,“this”等。

对于每一种语言的分词组件(Tokenizer),都有一个停词(stop word)集合。


经过分词(Tokenizer)后得到的结果称为词元(Token)。

在我们的例子中,便得到以下词元(Token):

“Students”,“allowed”,“go”,“their”,“friends”,“allowed”,“drink”,

“beer”,“My”,“friend”,“Jerry”,“went”,“school”,“see”,“his”,“

students”,“found”,“them”,“drunk”,“allowed”。

第三步:将得到的词元(TOKEN)传给语言处理组件(LINGUISTIC PROCESSOR)。

语言处理组件(linguistic processor)主要是对得到的词元(Token)做一些同语言相关的处理。

对于英语,语言处理组件(Linguistic Processor)一般做以下几点:

1. 变为小写(Lowercase)。

2. 将单词缩减为词根形式,如“cars”到“car”等。这种操作称为:stemming。

3. 将单词转变为词根形式,如“drove”到“drive”等。这种操作称为:lemmatization。


Stemming 和 lemmatization的异同:

相同之处:Stemming和lemmatization都要使词汇成为词根形式。
两者的方式不同:
Stemming采用的是“缩减”的方式:“cars”到“car”,“driving”到“drive”。
Lemmatization采用的是“转变”的方式:“drove”到“drove”,“driving”到“drive”。
两者的算法不同:
Stemming主要是采取某种固定的算法来做这种缩减,如去除“s”,去除“ing”加“e”,将“ational”变为“ate”,将“tional”变为“tion”。
Lemmatization主要是采用保存某种字典的方式做这种转变。比如字典中有“driving”到“drive”,“drove”到“drive”,“am, is, are”到“be”的映射,做转变时,只要查字典就可以了。
Stemming和lemmatization不是互斥关系,是有交集的,有的词利用这两种方式都能达到相同的转换。

语言处理组件(linguistic processor)的结果称为词(Term)。

在我们的例子中,经过语言处理,得到的词(Term)如下:

“student”,“allow”,“go”,“their”,“friend”,“allow”,“drink”,

“beer”,“my”,“friend”,“jerry”,“go”,“school”,“see”,“his”,

“student”,“find”,“them”,“drink”,“allow”。
也正是因为有语言处理的步骤,才能使搜索drove,而drive也能被搜索出来。


第四步:将得到的词(TERM)传给索引组件(INDEXER)。

原文地址:http://www.kailing.pub/article/index/arcid/72.html
再次吐槽这个编辑器,想要发个图片并茂的不容易
继续阅读 »
前言

上一篇博文,笔者相当于了解了Lucene是干嘛的,然后写了个hello World增进下对Lucene的感觉。个人觉得,学习一个新的东西时,首先从demo入手,能增加你对这个技术的兴趣,然后慢慢的深入其中的原理,就会有种拨开乌云见明月的感觉。当然,有的人喜欢从原理入手,这个见仁见智。总结来说,不管从哪里入手,对一门新的技术而言总归要知道其所有然

正文


Lucene是一个高效的,基于Java的全文检索库。

所以在了解Lucene之前要费一番工夫了解一下全文检索。

那么什么叫做全文检索呢?这要从我们生活中的数据说起。

我们生活中的数据总体分为两种:结构化数据和非结构化数据。

结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。
非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等。
当然有的地方还会提到第三种,半结构化数据,如XML,HTML等,当根据需要可按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。

非结构化数据又一种叫法叫全文数据。


按照数据的分类,搜索也分为两种:

对结构化数据的搜索:如对数据库的搜索,用SQL语句。再如对元数据的搜索,如利用windows搜索对文件名,类型,修改时间进行搜索等。
对非结构化数据的搜索:如利用windows的搜索也可以搜索文件内容,Linux下的grep命令,再如用Google和百度可以搜索大量内容数据。
对非结构化数据也即对全文数据的搜索主要有两种方法:

一种是顺序扫描法(Serial Scanning):所谓顺序扫描,比如 要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下 一个文件,直到扫描完所有的文件。如利用windows的搜索也可以搜索文件内容,只是相当的慢。如果你有一个80G硬盘,如果想在上面找到一个内容包含 某字符串的文件,不花他几个小时,怕是做不到。Linux下的grep命令也是这一种方式。大家可能觉得这种方法比较原始,但对于小数据量的文件,这种方 法还是最直接,最方便的。但是对于大量的文件,这种方法就很慢了。

有人可能会说,对非结构化数据顺序扫描很慢,对结构化数据的搜索却相对较快(由于结构化数据有一定的结构可以采取一定的搜索算法加快速度),那么把我们的非结构化数据想办法弄得有一定结构不就行了吗?

这种想法很天然,却构成了全文检索的基本思路,也即将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。

这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。

这种说法比较抽象,举几个例子就很容易明白,比如字典,字典的拼音表和部首检字表就相当于字典的索引,对每一个字的解释是非结构化的,如果字典没有 音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵母,分别只有 几种可以一一列举,于是将读音拿出来按一定的顺序排列,每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音,然后按其指向的页数, 便可找到我们的非结构化数据——也即对字的解释。


这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。
全文检索大体分两个过程,索引创建(Indexing)和搜索索引(Search)。

索引创建:将现实世界中所有的结构化和非结构化数据提取信息,创建索引的过程。
搜索索引:就是得到用户的查询请求,搜索创建的索引,然后返回结果的过程。
于是全文检索就存在三个重要问题:

1. 索引里面究竟存些什么?(Index)

2. 如何创建索引?(Indexing)

3. 如何对索引进行搜索?(Search)

下面我们顺序对每个个问题进行研究。


二、索引里面究竟存些什么

索引里面究竟需要存些什么呢?

首先我们来看为什么顺序扫描的速度慢:

其实是由于我们想要搜索的信息和非结构化数据中所存储的信息不一致造成的。

非结构化数据中所存储的信息是每个文件包含哪些字符串,也即已知文件,欲求字符串相对容易,也即是从文件到字符串的映射。而我们想搜索的信息是哪些 文件包含此字符串,也即已知字符串,欲求文件,也即从字符串到文件的映射。两者恰恰相反。于是如果索引总能够保存从字符串到文件的映射,则会大大提高搜索 速度。

由于从字符串到文件的映射是文件到字符串映射的反向过程,于是保存这种信息的索引称为反向索引。

反向索引的所保存的信息一般如下:

假设我的文档集合里面有100篇文档,为了方便表示,我们为文档编号从1到100,得到下面的结构

Lucene全文检索的基本原理

左边保存的是一系列字符串,称为词典。

每个字符串都指向包含此字符串的文档(Document)链表,此文档链表称为倒排表(Posting List)。

有了索引,便使保存的信息和要搜索的信息一致,可以大大加快搜索的速度。

比如说,我们要寻找既包含字符串“lucene”又包含字符串“solr”的文档,我们只需要以下几步:

1. 取出包含字符串“lucene”的文档链表。

2. 取出包含字符串“solr”的文档链表。

3. 通过合并链表,找出既包含“lucene”又包含“solr”的文件。

Lucene全文检索的基本原理

看到这个地方,有人可能会说,全文检索的确加快了搜索的速度,但是多了索引的过程,两者加起来不一定比顺序扫描快多少。的确,加上索引的过程,全文检索不一定比顺序扫描快,尤其是在数据量小的时候更是如此。而对一个很大量的数据创建索引也是一个很慢的过程。

然而两者还是有区别的,顺序扫描是每次都要扫描,而创建索引的过程仅仅需要一次,以后便是一劳永逸的了,每次搜索,创建索引的过程不必经过,仅仅搜索创建好的索引就可以了。

这也是全文搜索相对于顺序扫描的优势之一:一次索引,多次使用。


三、如何创建索引

全文检索的索引创建过程一般有以下几步:

第一步:一些要索引的原文档(DOCUMENT)。

为了方便说明索引创建过程,这里特意用两个文件为例:

文件一:Students should be allowed to go out with their friends, but not allowed to drink beer.

文件二:My friend Jerry went to school to see his students but found them drunk which is not allowed.


第二步:将原文档传给分次组件(TOKENIZER)。

分词组件(Tokenizer)会做以下几件事情(此过程称为Tokenize):

1. 将文档分成一个一个单独的单词。

2. 去除标点符号。

3. 去除停词(Stop word)。

所谓停词(Stop word)就是一种语言中最普通的一些单词,由于没有特别的意义,因而大多数情况下不能成为搜索的关键词,因而创建索引时,这种词会被去掉而减少索引的大小。

英语中挺词(Stop word)如:“the”,“a”,“this”等。

对于每一种语言的分词组件(Tokenizer),都有一个停词(stop word)集合。


经过分词(Tokenizer)后得到的结果称为词元(Token)。

在我们的例子中,便得到以下词元(Token):

“Students”,“allowed”,“go”,“their”,“friends”,“allowed”,“drink”,

“beer”,“My”,“friend”,“Jerry”,“went”,“school”,“see”,“his”,“

students”,“found”,“them”,“drunk”,“allowed”。

第三步:将得到的词元(TOKEN)传给语言处理组件(LINGUISTIC PROCESSOR)。

语言处理组件(linguistic processor)主要是对得到的词元(Token)做一些同语言相关的处理。

对于英语,语言处理组件(Linguistic Processor)一般做以下几点:

1. 变为小写(Lowercase)。

2. 将单词缩减为词根形式,如“cars”到“car”等。这种操作称为:stemming。

3. 将单词转变为词根形式,如“drove”到“drive”等。这种操作称为:lemmatization。


Stemming 和 lemmatization的异同:

相同之处:Stemming和lemmatization都要使词汇成为词根形式。
两者的方式不同:
Stemming采用的是“缩减”的方式:“cars”到“car”,“driving”到“drive”。
Lemmatization采用的是“转变”的方式:“drove”到“drove”,“driving”到“drive”。
两者的算法不同:
Stemming主要是采取某种固定的算法来做这种缩减,如去除“s”,去除“ing”加“e”,将“ational”变为“ate”,将“tional”变为“tion”。
Lemmatization主要是采用保存某种字典的方式做这种转变。比如字典中有“driving”到“drive”,“drove”到“drive”,“am, is, are”到“be”的映射,做转变时,只要查字典就可以了。
Stemming和lemmatization不是互斥关系,是有交集的,有的词利用这两种方式都能达到相同的转换。

语言处理组件(linguistic processor)的结果称为词(Term)。

在我们的例子中,经过语言处理,得到的词(Term)如下:

“student”,“allow”,“go”,“their”,“friend”,“allow”,“drink”,

“beer”,“my”,“friend”,“jerry”,“go”,“school”,“see”,“his”,

“student”,“find”,“them”,“drink”,“allow”。
也正是因为有语言处理的步骤,才能使搜索drove,而drive也能被搜索出来。


第四步:将得到的词(TERM)传给索引组件(INDEXER)。

原文地址:http://www.kailing.pub/article/index/arcid/72.html
再次吐槽这个编辑器,想要发个图片并茂的不容易
收起阅读 »

Lucene5.5入门第一篇——hello World

Lucene板块好冷清,这里将我之前的入门的博文搬过来,填不下空白,欢迎拍砖
认识Lucene

下面是百科对Lucene的描述:

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。

Lucene突出的优点

Lucene作为一个全文检索引擎,其具有如下突出的优点:
(1)索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
(2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。
(3)优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。
(4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
(5)已经默认实现了一套强大的查询引擎,用户无需自己编写代码即可使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search[11])、分组查询等等。
面对已经存在的商业全文检索引擎,Lucene也具有相当的优势。
首先,它的开发源代码发行方式(遵守Apache Software License[12]),在此基础上程序员不仅仅可以充分的利用Lucene所提供的强大功能,而且可以深入细致的学习到全文检索引擎制作技术和面向对象编程的实践,进而在此基础上根据应用的实际情况编写出更好的更适合当前应用的全文检索引擎。在这一点上,商业软件的灵活性远远不及Lucene。
其次,Lucene秉承了开放源代码一贯的架构优良的优势,设计了一个合理而极具扩充能力的面向对象架构,程序员可以在Lucene的基础上扩充各种功能,比如扩充中文处理能力,从文本扩充到HTML、PDF[13]等等文本格式的处理,编写这些扩展的功能不仅仅不复杂,而且由于Lucene恰当合理的对系统设备做了程序上的抽象,扩展的功能也能轻易的达到跨平台的能力。
最后,转移到apache软件基金会后,借助于apache软件基金会的网络平台,程序员可以方便的和开发者、其它程序员交流,促成资源的共享,甚至直接获得已经编写完备的扩充功能。最后,虽然Lucene使用Java语言写成,但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现(例如.net framework[14]),在遵守Lucene索引文件格式的基础上,使得Lucene能够运行在各种各样的平台上,系统管理员可以根据当前的平台适合的语言来合理的选择。
入门前的准备

了解一些关键字的概念:
Document
Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段。
Field
Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。
Analyzer
在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。
IndexWriter
IndexWriter 是 Lucene 用来创建索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来。
Directory
这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。
Query
这是一个抽象类,他有多个实现,比如 TermQuery, BooleanQuery, PrefixQuery. 这个类的目的是把用户输入的查询字符串封装成 Lucene 能够识别的 Query。
IndexSearcher
IndexSearcher 是用来在建立好的索引上进行搜索的。它只能以只读的方式打开一个索引,所以可以有多个 IndexSearcher 的实例在一个索引上进行操作。
Hits
Hits 是用来保存搜索结果的。

我的浅显理解
使用Lucene分为几个步骤,都是围绕索引展开的:
1.写索引 IndexWriter
2.读索引 IndexReader
3.查索引 IndexSearcher
4.封装查询条件,想到于写数据库的sql QueryParser
5.查询已查到的索引得到结果集 TopDocs ,可以得到Document的一个集合
正式入门,直接上代码                               

写索引:

package com.kl.luceneDemo;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import java.io.File;
import java.io.FileReader;
import java.nio.file.Paths;
/**
* @author kl by 2016/3/14
* @boke www.kailing.pub
*/
public class Indexer {
public IndexWriter writer;
/**
* 实例化写索引
*/
public Indexer(String indexDir)throws Exception{
Analyzer analyzer=new StandardAnalyzer();//分词器
IndexWriterConfig writerConfig=new IndexWriterConfig(analyzer);//写索引配置
//Directory ramDirectory= new RAMDirectory();//索引写的内存
Directory directory= FSDirectory.open(Paths.get(indexDir));//索引存储磁盘位置
writer=new IndexWriter(directory,writerConfig);//实例化一个写索引
}
/**
* 关闭写索引
* @throws Exception
*/
public void close()throws Exception{
writer.close();
}
/**
* 添加指定目录的所有文件的索引
* @param dataDir
* @return
* @throws Exception
*/
public int index(String dataDir)throws Exception{
File files=new File(dataDir).listFiles();//得到指定目录的文档数组
for(File file:files){
indexFile(file);
}
return writer.numDocs();
}
public void indexFile(File file)throws Exception{
System.out.println("索引文件:"+file.getCanonicalPath());//打印索引到的文件路径信息
Document document=getDocument(file);//得到一个文档信息,相对一个表记录
writer.addDocument(document);//写入到索引,相当于插入一个表记录
}

/**
* 返回一个文档记录
* @param file
* @return
* @throws Exception
*/
public Document getDocument(File file)throws Exception{
Document document=new Document();//实例化一个文档
document.add(new TextField("context",new FileReader(file)));//添加一个文档信息,相当于一个数据库表字段
document.add(new TextField("fileName",file.getName(), Field.Store.YES));//添加文档的名字属性
document.add(new TextField("filePath",file.getCanonicalPath(),Field.Store.YES));//添加文档的路径属性
return document;
}
public static void main(String ages){
String indexDir="E:\\LuceneIndex";
String dataDir="E:\\LuceneTestData";
Indexer indexer=null;
int indexSum=0;
try {
indexer=new Indexer(indexDir);
indexSum= indexer.index(dataDir);
System.out.printf("完成"+indexSum+"个文件的索引");

}catch (Exception e){
e.printStackTrace();
}finally {
try {
indexer.close();
}catch (Exception e){
e.printStackTrace();
}

}

}

}
读查索引

package com.kl.luceneDemo;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import java.nio.file.Paths;
/**
* @author kl by 2016/3/14
* @boke www.kailing.pub
*/
public class Searcher {
public static void search(String indexDir,String q)throws Exception{
Directory dir= FSDirectory.open(Paths.get(indexDir));//索引地址
IndexReader reader= DirectoryReader.open(dir);//读索引
IndexSearcher is=new IndexSearcher(reader);
Analyzer analyzer=new StandardAnalyzer(); // 标准分词器
QueryParser parser=new QueryParser("context", analyzer);//指定查询Document的某个属性
Query query=parser.parse(q);//指定查询索引内容,对应某个分词
TopDocs hits=is.search(query, 10);//执行搜索
System.out.println("匹配 "+q+"查询到"+hits.totalHits+"个记录");
for(ScoreDoc scoreDoc:hits.scoreDocs){
Document doc=is.doc(scoreDoc.doc);
System.out.println(doc.get("fileName"));//打印Document的fileName属性
}
reader.close();
}
public static void main(String args) {
String indexDir="E:\\LuceneIndex";
String q="Muir";
try {
search(indexDir,q);
} catch (Exception e) {
e.printStackTrace();
}
}
}
以下图片是我的文件目录和Lucene生成的索引文件
原文地址:http://www.kailing.pub/article/index/arcid/71.html
社区的富文本编辑器太low了,能不能换啊
继续阅读 »
Lucene板块好冷清,这里将我之前的入门的博文搬过来,填不下空白,欢迎拍砖
认识Lucene

下面是百科对Lucene的描述:

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。人们经常提到信息检索程序库,虽然与搜索引擎有关,但不应该将信息检索程序库与搜索引擎相混淆。

Lucene突出的优点

Lucene作为一个全文检索引擎,其具有如下突出的优点:
(1)索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式,使得兼容系统或者不同平台的应用能够共享建立的索引文件。
(2)在传统全文检索引擎的倒排索引的基础上,实现了分块索引,能够针对新的文件建立小文件索引,提升索引速度。然后通过与原有索引的合并,达到优化的目的。
(3)优秀的面向对象的系统架构,使得对于Lucene扩展的学习难度降低,方便扩充新功能。
(4)设计了独立于语言和文件格式的文本分析接口,索引器通过接受Token流完成索引文件的创立,用户扩展新的语言和文件格式,只需要实现文本分析的接口。
(5)已经默认实现了一套强大的查询引擎,用户无需自己编写代码即可使系统可获得强大的查询能力,Lucene的查询实现中默认实现了布尔操作、模糊查询(Fuzzy Search[11])、分组查询等等。
面对已经存在的商业全文检索引擎,Lucene也具有相当的优势。
首先,它的开发源代码发行方式(遵守Apache Software License[12]),在此基础上程序员不仅仅可以充分的利用Lucene所提供的强大功能,而且可以深入细致的学习到全文检索引擎制作技术和面向对象编程的实践,进而在此基础上根据应用的实际情况编写出更好的更适合当前应用的全文检索引擎。在这一点上,商业软件的灵活性远远不及Lucene。
其次,Lucene秉承了开放源代码一贯的架构优良的优势,设计了一个合理而极具扩充能力的面向对象架构,程序员可以在Lucene的基础上扩充各种功能,比如扩充中文处理能力,从文本扩充到HTML、PDF[13]等等文本格式的处理,编写这些扩展的功能不仅仅不复杂,而且由于Lucene恰当合理的对系统设备做了程序上的抽象,扩展的功能也能轻易的达到跨平台的能力。
最后,转移到apache软件基金会后,借助于apache软件基金会的网络平台,程序员可以方便的和开发者、其它程序员交流,促成资源的共享,甚至直接获得已经编写完备的扩充功能。最后,虽然Lucene使用Java语言写成,但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现(例如.net framework[14]),在遵守Lucene索引文件格式的基础上,使得Lucene能够运行在各种各样的平台上,系统管理员可以根据当前的平台适合的语言来合理的选择。
入门前的准备

了解一些关键字的概念:
Document
Document 是用来描述文档的,这里的文档可以指一个 HTML 页面,一封电子邮件,或者是一个文本文件。一个 Document 对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录,而每个 Field 对象就是记录的一个字段。
Field
Field 对象是用来描述一个文档的某个属性的,比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。
Analyzer
在一个文档被索引之前,首先需要对文档内容进行分词处理,这部分工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类,它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。
IndexWriter
IndexWriter 是 Lucene 用来创建索引的一个核心的类,他的作用是把一个个的 Document 对象加到索引中来。
Directory
这个类代表了 Lucene 的索引的存储的位置,这是一个抽象类,它目前有两个实现,第一个是 FSDirectory,它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory,它表示一个存储在内存当中的索引的位置。
Query
这是一个抽象类,他有多个实现,比如 TermQuery, BooleanQuery, PrefixQuery. 这个类的目的是把用户输入的查询字符串封装成 Lucene 能够识别的 Query。
IndexSearcher
IndexSearcher 是用来在建立好的索引上进行搜索的。它只能以只读的方式打开一个索引,所以可以有多个 IndexSearcher 的实例在一个索引上进行操作。
Hits
Hits 是用来保存搜索结果的。

我的浅显理解
使用Lucene分为几个步骤,都是围绕索引展开的:
1.写索引 IndexWriter
2.读索引 IndexReader
3.查索引 IndexSearcher
4.封装查询条件,想到于写数据库的sql QueryParser
5.查询已查到的索引得到结果集 TopDocs ,可以得到Document的一个集合
正式入门,直接上代码                               

写索引:

package com.kl.luceneDemo;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import java.io.File;
import java.io.FileReader;
import java.nio.file.Paths;
/**
* @author kl by 2016/3/14
* @boke www.kailing.pub
*/
public class Indexer {
public IndexWriter writer;
/**
* 实例化写索引
*/
public Indexer(String indexDir)throws Exception{
Analyzer analyzer=new StandardAnalyzer();//分词器
IndexWriterConfig writerConfig=new IndexWriterConfig(analyzer);//写索引配置
//Directory ramDirectory= new RAMDirectory();//索引写的内存
Directory directory= FSDirectory.open(Paths.get(indexDir));//索引存储磁盘位置
writer=new IndexWriter(directory,writerConfig);//实例化一个写索引
}
/**
* 关闭写索引
* @throws Exception
*/
public void close()throws Exception{
writer.close();
}
/**
* 添加指定目录的所有文件的索引
* @param dataDir
* @return
* @throws Exception
*/
public int index(String dataDir)throws Exception{
File files=new File(dataDir).listFiles();//得到指定目录的文档数组
for(File file:files){
indexFile(file);
}
return writer.numDocs();
}
public void indexFile(File file)throws Exception{
System.out.println("索引文件:"+file.getCanonicalPath());//打印索引到的文件路径信息
Document document=getDocument(file);//得到一个文档信息,相对一个表记录
writer.addDocument(document);//写入到索引,相当于插入一个表记录
}

/**
* 返回一个文档记录
* @param file
* @return
* @throws Exception
*/
public Document getDocument(File file)throws Exception{
Document document=new Document();//实例化一个文档
document.add(new TextField("context",new FileReader(file)));//添加一个文档信息,相当于一个数据库表字段
document.add(new TextField("fileName",file.getName(), Field.Store.YES));//添加文档的名字属性
document.add(new TextField("filePath",file.getCanonicalPath(),Field.Store.YES));//添加文档的路径属性
return document;
}
public static void main(String ages){
String indexDir="E:\\LuceneIndex";
String dataDir="E:\\LuceneTestData";
Indexer indexer=null;
int indexSum=0;
try {
indexer=new Indexer(indexDir);
indexSum= indexer.index(dataDir);
System.out.printf("完成"+indexSum+"个文件的索引");

}catch (Exception e){
e.printStackTrace();
}finally {
try {
indexer.close();
}catch (Exception e){
e.printStackTrace();
}

}

}

}
读查索引

package com.kl.luceneDemo;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import java.nio.file.Paths;
/**
* @author kl by 2016/3/14
* @boke www.kailing.pub
*/
public class Searcher {
public static void search(String indexDir,String q)throws Exception{
Directory dir= FSDirectory.open(Paths.get(indexDir));//索引地址
IndexReader reader= DirectoryReader.open(dir);//读索引
IndexSearcher is=new IndexSearcher(reader);
Analyzer analyzer=new StandardAnalyzer(); // 标准分词器
QueryParser parser=new QueryParser("context", analyzer);//指定查询Document的某个属性
Query query=parser.parse(q);//指定查询索引内容,对应某个分词
TopDocs hits=is.search(query, 10);//执行搜索
System.out.println("匹配 "+q+"查询到"+hits.totalHits+"个记录");
for(ScoreDoc scoreDoc:hits.scoreDocs){
Document doc=is.doc(scoreDoc.doc);
System.out.println(doc.get("fileName"));//打印Document的fileName属性
}
reader.close();
}
public static void main(String args) {
String indexDir="E:\\LuceneIndex";
String q="Muir";
try {
search(indexDir,q);
} catch (Exception e) {
e.printStackTrace();
}
}
}
以下图片是我的文件目录和Lucene生成的索引文件
原文地址:http://www.kailing.pub/article/index/arcid/71.html
社区的富文本编辑器太low了,能不能换啊 收起阅读 »

elasticsearch java api 增删改 操作

--添加数据
IndexRequestBuilder requestBuilder = null;
requestBuilder = client.prepareIndex(index, type, key).setRefresh(false);
requestBuilder.setSource(value).get();

--批量数据
BulkRequestBuilder bulkRequest = null;
bulkRequest = client.prepareBulk();
for (Map.Entry<String, Object> map : doc.entrySet()) {
bulkRequest.add(client.prepareIndex(index, type, map.getKey())
.setSource(CouchbaseUtil.GJSON.toJson(map.getValue())).setRefresh(false));
}
bulkRequest.get();
bulkRequest.request().requests().clear();

--更新数据
client.prepareUpdate().setIndex(index).setType(type).setId(id).setDoc(map).get();

--批量删除数据
BulkRequestBuilder bulk = null;
bulk = client.prepareBulk();
for (String id : ids) {
bulk.add(client.prepareDelete().setIndex(index).setType(type).setId(id));
}
bulk.get();
继续阅读 »
--添加数据
IndexRequestBuilder requestBuilder = null;
requestBuilder = client.prepareIndex(index, type, key).setRefresh(false);
requestBuilder.setSource(value).get();

--批量数据
BulkRequestBuilder bulkRequest = null;
bulkRequest = client.prepareBulk();
for (Map.Entry<String, Object> map : doc.entrySet()) {
bulkRequest.add(client.prepareIndex(index, type, map.getKey())
.setSource(CouchbaseUtil.GJSON.toJson(map.getValue())).setRefresh(false));
}
bulkRequest.get();
bulkRequest.request().requests().clear();

--更新数据
client.prepareUpdate().setIndex(index).setType(type).setId(id).setDoc(map).get();

--批量删除数据
BulkRequestBuilder bulk = null;
bulk = client.prepareBulk();
for (String id : ids) {
bulk.add(client.prepareDelete().setIndex(index).setType(type).setId(id));
}
bulk.get(); 收起阅读 »

elasticsearch遍历所有数据集

    BoolQueryBuilder bool=QueryBuilders.boolQuery();
        SearchResponse searchResponse = esClient.prepareSearch("index")
                .setTypes("type")
            .setSize(10000)
            //这个游标维持多长时间
            .setScroll(TimeValue.timeValueMinutes(8))
            .execute().actionGet();
         System.out.println(searchResponse.getHits().getTotalHits());
        while(true){
             for (SearchHit hit : searchResponse.getHits()) {
                   System.out.println(hit.getSourceAsString()));         
                }
            searchResponse = esClient.prepareSearchScroll(searchResponse.getScrollId())
                .setScroll(TimeValue.timeValueMinutes(8))
                .execute().actionGet();
            if (searchResponse.getHits().getHits().length == 0) {
                break;
            }
        }
继续阅读 »
    BoolQueryBuilder bool=QueryBuilders.boolQuery();
        SearchResponse searchResponse = esClient.prepareSearch("index")
                .setTypes("type")
            .setSize(10000)
            //这个游标维持多长时间
            .setScroll(TimeValue.timeValueMinutes(8))
            .execute().actionGet();
         System.out.println(searchResponse.getHits().getTotalHits());
        while(true){
             for (SearchHit hit : searchResponse.getHits()) {
                   System.out.println(hit.getSourceAsString()));         
                }
            searchResponse = esClient.prepareSearchScroll(searchResponse.getScrollId())
                .setScroll(TimeValue.timeValueMinutes(8))
                .execute().actionGet();
            if (searchResponse.getHits().getHits().length == 0) {
                break;
            }
        } 收起阅读 »

南京Elastic社区第一次线下活动

1. 主办方
Elastic中文社区  趋势科技
eslogo.jpg


2. 时间地点
 活动时间:2016年6月25日 14:00 - 17:30 
 活动地点:雨花区软件大道48号苏豪国际广场B座(靠花神庙地铁站)
suhao.PNG


3. 主题 
分享一:ES和Kibana在实时流量分析中的应用
演讲者简介:
杨润达​ 南京云利来软件科技有限公司研发部
 
主题简介:
流量的抓取和存储,流量的可视化,有关流量异常的案例分析,在线的kibana功能展示。
 
分享二:ELK平台SaaS化的问题和解决方案
演讲者简介:
翰思-王晓亮.jpg
 
王晓亮(Tomo Wang) 瀚思安信高级研发工程师
毕业于南京大学,曾就职于趋势科技、Opera,现任瀚思安信高级研发工程师,负责瀚思在线安全分析平台“安全易”的研发工作。
 
主题简介:
ELK(ElasticSearch,Logstash,Kibana)是一套有效的开源日志分析平台,它们作为工具使用非常便利,但是如果要围绕它们搭建在线服务,却有诸多问题。这次的分享主要介绍“安全易”在SaaS化ELK平台的过程中遇到的问题以及对应的技术方案。
 
分享三:ES在苏宁海量日志平台的实践
演讲者简介:
苏宁-彭燕卿.jpg

彭燕卿 苏宁云商IT总部监控研发中心技术副总监
9年软件研发经验,09年加入苏宁,先后从事了SOA系统开发、苏宁易购等大型网站的性能分析调优、监控平台等系统研发和架构工作,目前主要从事苏宁监控系统架构及技术管理工作,专注于APM以及Elasticsearch等实时计算领域。
 
主题简介:
实时日志平台ES架构演变,ES使用过程中遇到的坑及调优,Kibana二次开发等。
 
分享四:甲方安全看日志消息在ELK中的流转​
演讲者简介:
李天爽 闻心科技上海研发中心总监
毕业于南京大学,曾担任趋势科技高级工程师,携程信息安全部资深安全研发工程师。
 
主题简介:
分享携程的日志平台架构、安全事件在ELK中的生命周期、ES的权限方案等。
 
分享五:ES在移动病毒分析和检测中的应用
演讲者简介:
趋势-李啸.jpg

李啸(White Li) 趋势科技中国研发中心资深工程师
毕业于南京邮电大学,曾就职于小米、百度,专注于大规模分布式系统的架构和运维,现负责趋势科技移动安全专家系统的开发工作。
 
主题简介:
介绍ES在样本分析、检测系统中的应用和逐步演变,重点探讨碰到的问题和解决方案。
 
4. 主题slides

ES南京meetup资料


 
继续阅读 »
1. 主办方
Elastic中文社区  趋势科技
eslogo.jpg


2. 时间地点
 活动时间:2016年6月25日 14:00 - 17:30 
 活动地点:雨花区软件大道48号苏豪国际广场B座(靠花神庙地铁站)
suhao.PNG


3. 主题 
分享一:ES和Kibana在实时流量分析中的应用
演讲者简介:
杨润达​ 南京云利来软件科技有限公司研发部
 
主题简介:
流量的抓取和存储,流量的可视化,有关流量异常的案例分析,在线的kibana功能展示。
 
分享二:ELK平台SaaS化的问题和解决方案
演讲者简介:
翰思-王晓亮.jpg
 
王晓亮(Tomo Wang) 瀚思安信高级研发工程师
毕业于南京大学,曾就职于趋势科技、Opera,现任瀚思安信高级研发工程师,负责瀚思在线安全分析平台“安全易”的研发工作。
 
主题简介:
ELK(ElasticSearch,Logstash,Kibana)是一套有效的开源日志分析平台,它们作为工具使用非常便利,但是如果要围绕它们搭建在线服务,却有诸多问题。这次的分享主要介绍“安全易”在SaaS化ELK平台的过程中遇到的问题以及对应的技术方案。
 
分享三:ES在苏宁海量日志平台的实践
演讲者简介:
苏宁-彭燕卿.jpg

彭燕卿 苏宁云商IT总部监控研发中心技术副总监
9年软件研发经验,09年加入苏宁,先后从事了SOA系统开发、苏宁易购等大型网站的性能分析调优、监控平台等系统研发和架构工作,目前主要从事苏宁监控系统架构及技术管理工作,专注于APM以及Elasticsearch等实时计算领域。
 
主题简介:
实时日志平台ES架构演变,ES使用过程中遇到的坑及调优,Kibana二次开发等。
 
分享四:甲方安全看日志消息在ELK中的流转​
演讲者简介:
李天爽 闻心科技上海研发中心总监
毕业于南京大学,曾担任趋势科技高级工程师,携程信息安全部资深安全研发工程师。
 
主题简介:
分享携程的日志平台架构、安全事件在ELK中的生命周期、ES的权限方案等。
 
分享五:ES在移动病毒分析和检测中的应用
演讲者简介:
趋势-李啸.jpg

李啸(White Li) 趋势科技中国研发中心资深工程师
毕业于南京邮电大学,曾就职于小米、百度,专注于大规模分布式系统的架构和运维,现负责趋势科技移动安全专家系统的开发工作。
 
主题简介:
介绍ES在样本分析、检测系统中的应用和逐步演变,重点探讨碰到的问题和解决方案。
 
4. 主题slides

ES南京meetup资料


  收起阅读 »

杭州 Elastic社区第一次线下活动 开始报名啦!!!

PPT下载地址:
 百度云盘:  http://pan.baidu.com/s/1slQn93v   提取码:jqqi
 淘云盘: http://yunpan.taobao.com/s/E2TDSFivxt  提取码: vwIWlm
  
 Elastic 中文社区联手杭州码耘网络共同举办第一次线下聚会,欢迎对elastic、搜索、大数据等技术感兴趣的朋友来玩玩
  • 时间:2016-6-18 13:00:00
  • 地点:杭州市滨江区上峰电商产品园1-227(从聚才路门口进来会比较近,离阿里网易5分钟路程)


                               
 
 
分享主题 :   
  •   有赞搜索引擎实践   ——   洪斌@有赞大数据团队负责人
  •    Elastic结合Hbase的应用实践  —— 汪兴@浙大中控
  •    购阿购数据分析平台对Elasticsearch使用实践     —— 万斌@北京购阿购技术服务有限公司
  •    beats介绍与扩展   ——  曾勇@elastic
  •    基于ELK的云日志产品实践 —— 宁海元@袋鼠云
  •    elasticsearch-jdbc介绍以及基于binlog的增量数据同步方案 —— 卢栋@码耘网络  

 
 
报名方式:
  •   扫描下面微信二维码加入杭州Elastic聚会群,成功加入即算报名成功
  •   无法扫描的同学加我微信(573513542),我来拉你进群


                     
QQ20160613-2@2x.png



乘车:  
   附近公交站: 
  • 秋溢路聚才路口(139路直达)
  • 江虹路秋溢路口(139路、175路)
  • 滨安路江虹路口(225、B支6 路)

   地铁:
  •  坐到滨和路站或者西兴站,然后打车过来起步价

 
    ps :  如果到了滨江不认识路,可以打我手机(15858279062) 我可以来接你。
 
继续阅读 »
PPT下载地址:
 百度云盘:  http://pan.baidu.com/s/1slQn93v   提取码:jqqi
 淘云盘: http://yunpan.taobao.com/s/E2TDSFivxt  提取码: vwIWlm
  
 Elastic 中文社区联手杭州码耘网络共同举办第一次线下聚会,欢迎对elastic、搜索、大数据等技术感兴趣的朋友来玩玩
  • 时间:2016-6-18 13:00:00
  • 地点:杭州市滨江区上峰电商产品园1-227(从聚才路门口进来会比较近,离阿里网易5分钟路程)


                               
 
 
分享主题 :   
  •   有赞搜索引擎实践   ——   洪斌@有赞大数据团队负责人
  •    Elastic结合Hbase的应用实践  —— 汪兴@浙大中控
  •    购阿购数据分析平台对Elasticsearch使用实践     —— 万斌@北京购阿购技术服务有限公司
  •    beats介绍与扩展   ——  曾勇@elastic
  •    基于ELK的云日志产品实践 —— 宁海元@袋鼠云
  •    elasticsearch-jdbc介绍以及基于binlog的增量数据同步方案 —— 卢栋@码耘网络  

 
 
报名方式:
  •   扫描下面微信二维码加入杭州Elastic聚会群,成功加入即算报名成功
  •   无法扫描的同学加我微信(573513542),我来拉你进群


                     
QQ20160613-2@2x.png



乘车:  
   附近公交站: 
  • 秋溢路聚才路口(139路直达)
  • 江虹路秋溢路口(139路、175路)
  • 滨安路江虹路口(225、B支6 路)

   地铁:
  •  坐到滨和路站或者西兴站,然后打车过来起步价

 
    ps :  如果到了滨江不认识路,可以打我手机(15858279062) 我可以来接你。
  收起阅读 »

【招聘】ML/ES/DOCKER方向兼职培训师/讲师

 公司介绍:NobleProg(诺波中国),公司成立于2005年,总部设在英国伦敦并在欧洲和美国建立了特许经营和分公司。2015年来到中国,面对国内企业提供人工智能、IT、统计、管理、编程的培训和咨询服务。
 聘Machine Learning/Elasticserach/Ducker and kubemetes三个方向兼职培训师/讲师。
基本要求如下:
1、具有丰富的理论知识和技能;
2、有一定的项目经验(这包括你是项目leader或项目组成员);
3、有培训师或讲师的经验最佳; 
4、可以依据我们提供的培训大纲结合客户需求做出培训计划;  
5、可授受出差(视项目决定);
6、可接受兼职;
7、薪资待遇请与我们商谈。
 
公司网站:http://www.nobleprog.cn/training
对以上招聘信息感兴趣,请与我们联系。
 
Tina
手机:18610650025
QQ:1575119117
继续阅读 »
 公司介绍:NobleProg(诺波中国),公司成立于2005年,总部设在英国伦敦并在欧洲和美国建立了特许经营和分公司。2015年来到中国,面对国内企业提供人工智能、IT、统计、管理、编程的培训和咨询服务。
 聘Machine Learning/Elasticserach/Ducker and kubemetes三个方向兼职培训师/讲师。
基本要求如下:
1、具有丰富的理论知识和技能;
2、有一定的项目经验(这包括你是项目leader或项目组成员);
3、有培训师或讲师的经验最佳; 
4、可以依据我们提供的培训大纲结合客户需求做出培训计划;  
5、可授受出差(视项目决定);
6、可接受兼职;
7、薪资待遇请与我们商谈。
 
公司网站:http://www.nobleprog.cn/training
对以上招聘信息感兴趣,请与我们联系。
 
Tina
手机:18610650025
QQ:1575119117 收起阅读 »

发布个es迁移工具:elasticsearch-migration

https://github.com/medcl/elasticsearch-migration
支持多个版本间的数据迁移,使用scroll+bulk
1.版本支持1.x,2.x.5.0 (0.x未测试)
2.支持http basic auth 认证的es集群
3.支持导入覆盖索引名称(目前只支持单个索引导入的情况下可指定)
4.支持index setting和mapping的同步(相关es大版本,2.x和5.0之间不支持)
5.支持dump到本地文件
6.支持从dump文件加载导入到指定索引
 
欢迎测试!
 
#copy index index_name from 192.168.1.x to 192.168.1.y:9200
./bin/esm -s http://192.168.1.x:9200 -d http://192.168.1.y:9200 -x index_name -w=5 -b=10 -c 10000

#copy index src_index from 192.168.1.x to 192.168.1.y:9200 and save with dest_index
./bin/esm -s http://localhost:9200 -d http://localhost:9200 -x src_index -y dest_index -w=5 -b=100

#support Basic-Auth
./bin/esm -s http://localhost:9200/ -x "src_index" -y "dest_index" -d http://localhost:9201 -n admin:111111

#copy settings and override shard size
./bin/esm -s http://localhost:9200/ -x "src_index" -y "dest_index" -d http://localhost:9201 -m admin:111111 -c 10000 --shards=50 --copy_settings

#copy settings and mapping, recreate target index, add query to source fetch, refresh after migration
./bin/esm -s http://localhost:9200/ -x "src_index" -q=query:phone -y "dest_index" -d http://localhost:9201 -c 10000 --shards=5 --copy_settings --copy_mapping --force --refresh

#dump elasticsearch documents into local file
./bin/esm -s http://localhost:9200 -x "src_index" -m admin:111111 -c 5000 -b -q=query:mixer --refresh -o=dump.bin

#loading data from dump files, bulk insert to another es instance
./bin/esm -d http://localhost:9200 -y "dest_index" -n admin:111111 -c 5000 -b 5 --refresh -i=dump.bin

 
继续阅读 »
https://github.com/medcl/elasticsearch-migration
支持多个版本间的数据迁移,使用scroll+bulk
1.版本支持1.x,2.x.5.0 (0.x未测试)
2.支持http basic auth 认证的es集群
3.支持导入覆盖索引名称(目前只支持单个索引导入的情况下可指定)
4.支持index setting和mapping的同步(相关es大版本,2.x和5.0之间不支持)
5.支持dump到本地文件
6.支持从dump文件加载导入到指定索引
 
欢迎测试!
 
#copy index index_name from 192.168.1.x to 192.168.1.y:9200
./bin/esm -s http://192.168.1.x:9200 -d http://192.168.1.y:9200 -x index_name -w=5 -b=10 -c 10000

#copy index src_index from 192.168.1.x to 192.168.1.y:9200 and save with dest_index
./bin/esm -s http://localhost:9200 -d http://localhost:9200 -x src_index -y dest_index -w=5 -b=100

#support Basic-Auth
./bin/esm -s http://localhost:9200/ -x "src_index" -y "dest_index" -d http://localhost:9201 -n admin:111111

#copy settings and override shard size
./bin/esm -s http://localhost:9200/ -x "src_index" -y "dest_index" -d http://localhost:9201 -m admin:111111 -c 10000 --shards=50 --copy_settings

#copy settings and mapping, recreate target index, add query to source fetch, refresh after migration
./bin/esm -s http://localhost:9200/ -x "src_index" -q=query:phone -y "dest_index" -d http://localhost:9201 -c 10000 --shards=5 --copy_settings --copy_mapping --force --refresh

#dump elasticsearch documents into local file
./bin/esm -s http://localhost:9200 -x "src_index" -m admin:111111 -c 5000 -b -q=query:mixer --refresh -o=dump.bin

#loading data from dump files, bulk insert to another es instance
./bin/esm -d http://localhost:9200 -y "dest_index" -n admin:111111 -c 5000 -b 5 --refresh -i=dump.bin

  收起阅读 »

北京 Elastic社区第一次线下活动

1、主办方:
    

      ElasticSearch中文社区    奇点机智

QQ20160511-0@2x.png




2、时间与地点:


      5月15日14:00 - 17:30(周日)

     北京海淀区中关村鼎好电子大厦太库孵化器路演厅


QQ20160511-8@2x.png


 

沙龙主题:


分享一:5miles基于es的对外搜索业务实践 

QQ20160511-1@2x.png


王浩宇

5miles搜索工程师

主题简介:

和大家交流一些5miles对外搜索业务中的工作,例如基于es function_score 的rerank的实现,通过geohash减少请求,通过多个data center来实现请求异步,风险控制等

 

分享二: Elasticsearch与Spark的整合

QQ20160511-2@2x.png



祝威廉

多年大数据经验,现专注于Spark/ES 相关领域

主题简介:

个人对ElasticSearch 和 Spark的整合一些看法,简要介绍通过对elasticsearch-hadoop项目的改进,以Spark 和 ElasticSearch 为依托,构建一个Ad-Hoc 查询引擎。

 

分享三:ElasticStack 5.0 介绍


QQ20160511-3@2x.png



medcl

Developer@Elastic

主题简介:

ElasticStack 5.0的新特性介绍


 

活动流程:


13:00-13:45  签到及入场

13:45-14:00  主持人介绍活动

14:00-15:00  王浩宇    5miles基于es的对外搜索业务实践

15:00-16:00  祝威廉    ElasticSearch 与 Spark 的整合 

16:00-16:30  茶歇与自由沟通

16:30-17:30  medcl   ElasticStack 5.0 介绍


QQ20160511-5@2x.png




报名方式:

本次活动全程免费,欢迎报名
http://www.huodongxing.com/event/6334153926600#rd


活动联系:
联系人:凌霄
手机:18600209779
邮箱:hellolingxiao@gmail.com



QQ20160511-7@2x.png

想要加入Elastic北京微信群,扫描上方二维码加小助手拉你进群

QQ20160511-6@2x.png






 
继续阅读 »
1、主办方:
    

      ElasticSearch中文社区    奇点机智

QQ20160511-0@2x.png




2、时间与地点:


      5月15日14:00 - 17:30(周日)

     北京海淀区中关村鼎好电子大厦太库孵化器路演厅


QQ20160511-8@2x.png


 

沙龙主题:


分享一:5miles基于es的对外搜索业务实践 

QQ20160511-1@2x.png


王浩宇

5miles搜索工程师

主题简介:

和大家交流一些5miles对外搜索业务中的工作,例如基于es function_score 的rerank的实现,通过geohash减少请求,通过多个data center来实现请求异步,风险控制等

 

分享二: Elasticsearch与Spark的整合

QQ20160511-2@2x.png



祝威廉

多年大数据经验,现专注于Spark/ES 相关领域

主题简介:

个人对ElasticSearch 和 Spark的整合一些看法,简要介绍通过对elasticsearch-hadoop项目的改进,以Spark 和 ElasticSearch 为依托,构建一个Ad-Hoc 查询引擎。

 

分享三:ElasticStack 5.0 介绍


QQ20160511-3@2x.png



medcl

Developer@Elastic

主题简介:

ElasticStack 5.0的新特性介绍


 

活动流程:


13:00-13:45  签到及入场

13:45-14:00  主持人介绍活动

14:00-15:00  王浩宇    5miles基于es的对外搜索业务实践

15:00-16:00  祝威廉    ElasticSearch 与 Spark 的整合 

16:00-16:30  茶歇与自由沟通

16:30-17:30  medcl   ElasticStack 5.0 介绍


QQ20160511-5@2x.png




报名方式:

本次活动全程免费,欢迎报名
http://www.huodongxing.com/event/6334153926600#rd


活动联系:
联系人:凌霄
手机:18600209779
邮箱:hellolingxiao@gmail.com



QQ20160511-7@2x.png

想要加入Elastic北京微信群,扫描上方二维码加小助手拉你进群

QQ20160511-6@2x.png






  收起阅读 »

es分词索引创建

{
    "settings": {
        "index": {
            "number_of_replicas": "0",
            "number_of_shards": "5",
            "refresh_interval": "-1",
            "translog.flush_threshold_ops": "100000"
        }
    },
    "mappings": {
        "etp_t": {
            "properties": {
                "dd": {
                    "type": "multi_field",
                    "fields": {
                        "pn": {
                            "type": "string",
                            "store": "yes",
                            "analyzer": "pinyin_first_letter",
                            "search_analyzer": "pinyin_first_letter"
                        },
                        "pk": {
                            "type": "string",
                            "store": "yes",
                            "analyzer": "pinyin_ngram_analyzer",
                            "search_analyzer": "pinyin_ngram_analyzer"
                        },
                        "cn": {
                            "type": "string",
                            "store": "yes",
                            "analyzer": "ik_max_word",
                            "search_analyzer": "ik_max_word",
                            "term_vector": "with_positions_offsets",
                            "boost": 10
                        },
                        "un": {
                            "type": "string",
                            "index": "not_analyzed"
                        }
                    }
                }
            }
        }
    }
}
继续阅读 »
{
    "settings": {
        "index": {
            "number_of_replicas": "0",
            "number_of_shards": "5",
            "refresh_interval": "-1",
            "translog.flush_threshold_ops": "100000"
        }
    },
    "mappings": {
        "etp_t": {
            "properties": {
                "dd": {
                    "type": "multi_field",
                    "fields": {
                        "pn": {
                            "type": "string",
                            "store": "yes",
                            "analyzer": "pinyin_first_letter",
                            "search_analyzer": "pinyin_first_letter"
                        },
                        "pk": {
                            "type": "string",
                            "store": "yes",
                            "analyzer": "pinyin_ngram_analyzer",
                            "search_analyzer": "pinyin_ngram_analyzer"
                        },
                        "cn": {
                            "type": "string",
                            "store": "yes",
                            "analyzer": "ik_max_word",
                            "search_analyzer": "ik_max_word",
                            "term_vector": "with_positions_offsets",
                            "boost": 10
                        },
                        "un": {
                            "type": "string",
                            "index": "not_analyzed"
                        }
                    }
                }
            }
        }
    }
} 收起阅读 »

【内附讲师干货PPT】首届ES中文社区技术沙龙广州站圆满举行咯

4月23日,首届Elasticsearch中文社区技术沙龙【广州站】在广州筑梦咖啡成功举行。


2016年ES中文社区全国巡回技术沙龙,分别在北京、上海、广州三地召开。【广州站】由ES中文社区和数说故事共同举办,主题为“企业级搜索引擎与大数据实战分享”,共吸引了来自腾讯、网易、欢聚时代、金蝶及舜飞科技等企业的共120+观众到现场交流。来自于欢聚时代的赖鸿智、数说故事的黄耀鸿、塔布数据的何金城三位ES大牛从入门到实战经验给现场观众带来了一次关于ES的干货分享。
 


嘉宾.jpg

 
三位讲师分别从【入门】:ES优化技巧及工具推荐、【重点】基于父子文档实现的ES关联查询、【实战】亿级规模的ES查询优化实战三个层面对ES进行了介绍。赖鸿智指出自己在2011年就已经接触到ES,对于ES的初学者他从管理及监控两个方面做了一些工具的推荐。
 
更多精彩内容,下载讲师ppt吧
http://pan.baidu.com/s/1sliR7qP
提取密码:v5p3
 
 
继续阅读 »
4月23日,首届Elasticsearch中文社区技术沙龙【广州站】在广州筑梦咖啡成功举行。


2016年ES中文社区全国巡回技术沙龙,分别在北京、上海、广州三地召开。【广州站】由ES中文社区和数说故事共同举办,主题为“企业级搜索引擎与大数据实战分享”,共吸引了来自腾讯、网易、欢聚时代、金蝶及舜飞科技等企业的共120+观众到现场交流。来自于欢聚时代的赖鸿智、数说故事的黄耀鸿、塔布数据的何金城三位ES大牛从入门到实战经验给现场观众带来了一次关于ES的干货分享。
 


嘉宾.jpg

 
三位讲师分别从【入门】:ES优化技巧及工具推荐、【重点】基于父子文档实现的ES关联查询、【实战】亿级规模的ES查询优化实战三个层面对ES进行了介绍。赖鸿智指出自己在2011年就已经接触到ES,对于ES的初学者他从管理及监控两个方面做了一些工具的推荐。
 
更多精彩内容,下载讲师ppt吧
http://pan.baidu.com/s/1sliR7qP
提取密码:v5p3
 
  收起阅读 »

社区使用WeCenter,一个开源的php+mysql社区问答系统搭建

前言

之前学习Lucene和ElasticSearch的时候经常逛逛Elastic的中文社区,发现社区做的蛮不错的,风格和ui都比较清新,今天突然看到了一个站和其风格类似,我就肯定是个开源的产品二次开发的,后来发现了WeCenter,一个很不错的社区问答系统

简介

WeCenter 是一款知识型的社交化开源社区程序,专注于企业和行业社区内容的整理、归类、检索和再发行。

为什么选择WeCenter

管理中心,一手掌控
管理中心为你建立起快速通路,所有功能开关,只需轻点一下,即可轻松完成配置,如此众多的操控,任你一挥而就

开放源码,便捷开发
WeCenter 含有多项创新功能,遵循 MVC 架构,充分利用当下最新技术,对于开发者来说都会大有帮助,二次开发,更强定制,更易上手

个性路由,个性定制
WeCenter 让你用你喜欢的方式,更灵活地定制 URL 路由,URL 地址不再是千篇一律的样式,在 SEO 优化上祝你一臂之力
设计之妙,上手即知
我们创造的每一件产品,从来都不仅仅追求设计的美观。我们在考虑设计的同时,更希望用户更能容易定制模板,最终我们选择了 Bootstrap,定制模板时你会发现一切都是那么的方便,简易

安装初体验

从官网下载源代码后将UPLOAD放入你的http服务器入目下,开始安装体验之旅

QQ图片20160425102527.png

原文地址:http://www.kailing.pub/article ... .html
继续阅读 »
前言

之前学习Lucene和ElasticSearch的时候经常逛逛Elastic的中文社区,发现社区做的蛮不错的,风格和ui都比较清新,今天突然看到了一个站和其风格类似,我就肯定是个开源的产品二次开发的,后来发现了WeCenter,一个很不错的社区问答系统

简介

WeCenter 是一款知识型的社交化开源社区程序,专注于企业和行业社区内容的整理、归类、检索和再发行。

为什么选择WeCenter

管理中心,一手掌控
管理中心为你建立起快速通路,所有功能开关,只需轻点一下,即可轻松完成配置,如此众多的操控,任你一挥而就

开放源码,便捷开发
WeCenter 含有多项创新功能,遵循 MVC 架构,充分利用当下最新技术,对于开发者来说都会大有帮助,二次开发,更强定制,更易上手

个性路由,个性定制
WeCenter 让你用你喜欢的方式,更灵活地定制 URL 路由,URL 地址不再是千篇一律的样式,在 SEO 优化上祝你一臂之力
设计之妙,上手即知
我们创造的每一件产品,从来都不仅仅追求设计的美观。我们在考虑设计的同时,更希望用户更能容易定制模板,最终我们选择了 Bootstrap,定制模板时你会发现一切都是那么的方便,简易

安装初体验

从官网下载源代码后将UPLOAD放入你的http服务器入目下,开始安装体验之旅

QQ图片20160425102527.png

原文地址:http://www.kailing.pub/article ... .html 收起阅读 »

elasticearch,jdk,maven安装


  
安装jdk

下载地址

http://www.oracle.com/technetw ... .html

 


 
 
 

JAVA_HOME  :   E:\Java\jdk1.7.0

 

Path   :  %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

 

CLASSPATH  : .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

 

 

 

首先下载最新的elasticsearch安装版本

https://www.elastic.co/downloads/elasticsearch

 

安装插件

elasticsearch插件elasticsearch-head安装: plugininstall mobz/elasticsearch-head

 

elasticsearch插件bigdesk安装:plugininstall lukas-vlcek/bigdesk

 

前台运行es

在cmd命令行进入安装目录,再进入 bin目录,运行elasticsearch.bat命令: elasticsearch

后台运行es

进入E:\Install_SoftWare\elasticsearch2.2.0\bin

注册服务  service.bat install
 

 

内存分配

打开E:\Install_SoftWare\elasticsearch2.2.0\bin\service.bat
 

或着修改注册表参数

打开regedit

 

 

全路径:hkey_local_machine/software/wow6432node/apacheSoftware foundation/procrun2.0/elasticsearch-service-x64/java

 

启动成功如下图
简单查询
复杂查询
elasticsearch.yml文件配置

 

cluster.name: pq  es名称 

 

node.name: node10 节点名称 

 

node.master: true 设为主节点

node.master: false 不为主节点

 

node.data: false 不存储数据

node.data:true  存储数据

 

组合master, data

Master=true, data=false  该节点做为主节点

Master=true, data=true  该节点既是主节点又是数据节点

Master=false, data=true  该节点做为数据节点

Master=false, data= false 该节点做为负载均衡节点

 

 

 

path.data: G:\es_data,F:\es_data  数据存储路径  只有数据节点存储数据

 

path.logs: D:\es_logs  日志存储路径

 

bootstrap.mlockall: true  用来锁定内存

 

network.host: 0.0.0.0  设置ip

http.port: 9200  设置http端口

transport.tcp.port: 9300  设置tcp端口

discovery.zen.ping.unicast.hosts:["0.0.*.*","*.*.*.*:9300"]设置群集ip地址

 

 

 

分词安装(IK分词)

Maven环境配置

官方下载地址:http://maven.apache.org/download.html
 
 
 


 

 

 https://github.com/medcl/elasticsearch-analysis-ik下载地址

 

把下载的elasticsearch-analysis-ik.zip 解压。

 

 Maven 打包

进入elasticsearch-analysis-ik-master/ 下,打包。注意:打包后的文件在elasticsearch-analysis-ik-master/target/目录下
 

然后在elasticsearch-2.2.0/plugins下创建目录 ik
 

然后将打包后的elasticsearch-analysis-ik-1.8.0.jar 放入当前目录下
 

 

Maven 打包命令  mvn clean   package

 

在 Elasticsearch 的config下的elasticsearch.yml文件中,添加如下代码。 设置(2.0以上可以不设置)。1.  index:  2.        analysis:                     3.          analyzer:        4.            ik:  5.               alias: [ik_analyzer]  6.                type:org.elasticsearch.index.analysis.IkAnalyzerProvider  7.            ik_max_word:  8.                type: ik 9.                use_smart: false  10.           ik_smart:  11.               type: ik  12.              use_smart: true或者简单配置:index.analysis.analyzer.ik.type : “ik”

 

分词测试

  http://127.0.0.0:9215/index/_a ... true/

post

{"text":"刑事判决书"}、
 

 

 

详细ik分词配置网址

http://www.sojson.com/blog/82
继续阅读 »

  
安装jdk

下载地址

http://www.oracle.com/technetw ... .html

 


 
 
 

JAVA_HOME  :   E:\Java\jdk1.7.0

 

Path   :  %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;

 

CLASSPATH  : .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

 

 

 

首先下载最新的elasticsearch安装版本

https://www.elastic.co/downloads/elasticsearch

 

安装插件

elasticsearch插件elasticsearch-head安装: plugininstall mobz/elasticsearch-head

 

elasticsearch插件bigdesk安装:plugininstall lukas-vlcek/bigdesk

 

前台运行es

在cmd命令行进入安装目录,再进入 bin目录,运行elasticsearch.bat命令: elasticsearch

后台运行es

进入E:\Install_SoftWare\elasticsearch2.2.0\bin

注册服务  service.bat install
 

 

内存分配

打开E:\Install_SoftWare\elasticsearch2.2.0\bin\service.bat
 

或着修改注册表参数

打开regedit

 

 

全路径:hkey_local_machine/software/wow6432node/apacheSoftware foundation/procrun2.0/elasticsearch-service-x64/java

 

启动成功如下图
简单查询
复杂查询
elasticsearch.yml文件配置

 

cluster.name: pq  es名称 

 

node.name: node10 节点名称 

 

node.master: true 设为主节点

node.master: false 不为主节点

 

node.data: false 不存储数据

node.data:true  存储数据

 

组合master, data

Master=true, data=false  该节点做为主节点

Master=true, data=true  该节点既是主节点又是数据节点

Master=false, data=true  该节点做为数据节点

Master=false, data= false 该节点做为负载均衡节点

 

 

 

path.data: G:\es_data,F:\es_data  数据存储路径  只有数据节点存储数据

 

path.logs: D:\es_logs  日志存储路径

 

bootstrap.mlockall: true  用来锁定内存

 

network.host: 0.0.0.0  设置ip

http.port: 9200  设置http端口

transport.tcp.port: 9300  设置tcp端口

discovery.zen.ping.unicast.hosts:["0.0.*.*","*.*.*.*:9300"]设置群集ip地址

 

 

 

分词安装(IK分词)

Maven环境配置

官方下载地址:http://maven.apache.org/download.html
 
 
 


 

 

 https://github.com/medcl/elasticsearch-analysis-ik下载地址

 

把下载的elasticsearch-analysis-ik.zip 解压。

 

 Maven 打包

进入elasticsearch-analysis-ik-master/ 下,打包。注意:打包后的文件在elasticsearch-analysis-ik-master/target/目录下
 

然后在elasticsearch-2.2.0/plugins下创建目录 ik
 

然后将打包后的elasticsearch-analysis-ik-1.8.0.jar 放入当前目录下
 

 

Maven 打包命令  mvn clean   package

 

在 Elasticsearch 的config下的elasticsearch.yml文件中,添加如下代码。 设置(2.0以上可以不设置)。1.  index:  2.        analysis:                     3.          analyzer:        4.            ik:  5.               alias: [ik_analyzer]  6.                type:org.elasticsearch.index.analysis.IkAnalyzerProvider  7.            ik_max_word:  8.                type: ik 9.                use_smart: false  10.           ik_smart:  11.               type: ik  12.              use_smart: true或者简单配置:index.analysis.analyzer.ik.type : “ik”

 

分词测试

  http://127.0.0.0:9215/index/_a ... true/

post

{"text":"刑事判决书"}、
 

 

 

详细ik分词配置网址

http://www.sojson.com/blog/82 收起阅读 »

elasticsearch读取多个redis值

input{
    redis{
        host => "192.168.80.50"
        port => 6379
        password => "xxx"
        data_type => "list"
        key => "logstash-ljk-screen"
        codec => json
        type=>"ljkscreen"
    }
    redis{
        host => "192.168.80.50"
        port => 6379
        password => "xxx"
        data_type => "list"
        key => "logstash-kg-media"
        codec => json
                type=>"kgmedia"
                
    }
}
继续阅读 »
input{
    redis{
        host => "192.168.80.50"
        port => 6379
        password => "xxx"
        data_type => "list"
        key => "logstash-ljk-screen"
        codec => json
        type=>"ljkscreen"
    }
    redis{
        host => "192.168.80.50"
        port => 6379
        password => "xxx"
        data_type => "list"
        key => "logstash-kg-media"
        codec => json
                type=>"kgmedia"
                
    }
} 收起阅读 »