一、文档的基本CRUD与批量操作
1、文档的CRUD操作
(1)Type名,约定都用_doc
(2)Create:如果ID已经存在,会失败
(3)Index:如果ID不存在,创建新的文档。否则,先删除现有的文档,在创建新的文档,版本会增加。
(4)Update:文档必须已经存在,更新只会对相应字段做增量修改
2、Create一个文档
(1)支持自动生成文档ID和指定文档ID两种方式
(2)通过调用“post movies/_doc”,系统会自动生成dociment id
(3)使用http put movies/_create/1创建时,url中显示指定_create,此时如果该id的文档已经存在,操作失败
3、Get一个文档
(1)找到文档,返回HTTP 200
- 版本信息,同一个id的文档,即使被删除,Version号也会不断增加
- _source中默认包含了文档的所有原始信息
(2)找不到文档,返回HTTP 404
4、Index文档
(1)Index和Create的区别:如果文档不存在,就索引新的文档。否则现有的文档会被删除,新的文档被索引并且版本+1
5、Update文档
(1)Update方法不会删除原来的文档,而是实现真正的数据更新
(2)Post方法/Payload需要包含在“doc”中
6、bulk api
(1)支持一次API调用中,对不同的索引进行操作
(2)支持四种类型
- index
- create
- update
- delete
(3)可以在url中指定index,也可以在请求的payload中进行
(4)操作中单条操作失败,并不会影响其他操作
(5)返回结果包括了每一条操作执行的结果
7、批量读取
(1)批量操作,可以减少网络连接所产生的开销
二、倒排索引
(1)要理解正排索引和倒排索引,可以看以下例子,比如你要找到elasticsearch这个单词
- 正排索引就是从文档ID到文档内容再到单词
- 倒排索引就是从单词到文档内容再到文档ID
(2)倒排索引
- 单词词典(Term Dictionary),记录所有文档的单词,记录单词到倒排列表的关联关系。单词词典一般比较大,可以通过B+树或者哈希拉链法实现,以满足高性能的插入与查询。
- 倒排列表(Posting List)记录了单词对应的文档结合,由倒排索引项组成
(3)倒排索引项
- 文档ID
- 词频TF:该单词在文档中出现的次数,用于相关性评分
- 位置(Position):单词在文档中分词的位置。用于语句搜索(phrase query)
- 偏移(Offset):记录单词开始结束位置,实现高亮显示
elasticsearch单词对应的倒排索引,例子如下:
(4)ElasticSearch的倒排索引
- ElasticSearch的JSON文档中的每个字段,都有自己的倒排索引
- 可以指定对那些字段不做索引,优点是节省存储空间,缺点是字段无法被搜索
三、Analyze分词
1、Analyze的基本定义
(1)Analysis与Analyzer
- Analysis:文本分析是把全文本转换一系列单词(term/token)的过程,也叫分词
- Analysis:是通过Analyzer来实现的,可使用ElasticSearch内置的分析器/或者按需要定制化分析器
- 除了在数据写入时转换词条,匹配Query语句时也需要用相应的分析器对查询语法进行分析
(2)分词器是专门处理分词的组件,Analyzer由三部分组成。Character Filters(针对原始文本处理,例如去除html)/Tokenizer(按照规则切分单词)/Token Filter(将切分的单词进行加功,小写,删除stopword(例如:in、on、the等),增加同义词)
(3)ElasticSearch的内置分词器
- Standard Analyzer:默认分词器,按照词切分,小写处理
- Simple Analyzer:按照非字母切分(符号被过滤),小写处理
- Stop Analyzer:小写处理,停用词过滤(the,a,is)
- Whitespace Analyzer:按照空格切分,不转小写
- Keyword Analyzer:不分词,直接将输入当作输出
- Patter Analyzer:正则表达式,默认\W+(非字符分割)
- Language:提供了30多种常见语言的分词器
- Customer Analyzer:自定义分词器
(4)使用_analyzer
- 直接使用指定Analyzer进行测试
-
指定索引的字段进行测试,默认使用Standard 分词器
-
自定义分词进行测试
2、Analyze的类型
(1)Standard Analyzer
-
默认分词器
-
按词切分
-
小写处理
(2)Simple Analyzer -
按照非字母切分,非字母的都被去除
-
小写处理
(3)Whitespace Analyzer
- 按照空格切分
(4)Stop Analyzer
- 相比Simple Analyzer
- 多了stop filter,会把the、is、a等修饰性词去掉
(5)Keyword Analyzer
- 不分词,直接将输入当一个term输出
(6)Pattern Analyzer
- 通过正则表达式进行分词
- 默认式是\W+,非字符的符号进行分隔
(7)Language Analyzer
- 为不同的语言提供了不同的Analyzer
三、中为分词
(1)、中为分词的难点
- 中文句子,切分成一个一个词(不是一个个字)
- 英文中,单词有自然的空格作为分隔
- 一句中文,在不同的上下文,有不同的理解,例如:这个苹果,不大好吃\这个苹果,不大,好吃
- 一些例子,他说的确实在理/这事的确确定不下来
(2)ICU Analyzer
- 需要安装plugin,Elasticsearch-plugin install analysis-icu
- 提供了Unicode的支持,更好的支持亚洲语言
如果用standard分词,那么会把语句分词一个个中文
如果用icu_analyzer分词,因为icu_analyzer支持中文较好,会根据语义分词
(3)更好的、更智能的中文分词器
- ik
支持自定义词库,支持热更新分词词典
https://github.com/medcl/elasticsearch-analysis-ik/tree/master
ik有两种分词器,如下:
ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合,适合 Term Query;
ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”,适合 Phrase 查询。
我们可以看下”他说的确实在理“在这两个分词器下的效果:
- THULAC
THU Lexucal Analyzer for Chinese,清华大学自然语言处理和社会人文计算实验室的一套中文分词器
https://github.com/microbun/elasticsearch-thulac-plugin