一、倒排索引
1、什么是倒排索引
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g7SO2mhV-1596981293103)(http://note.youdao.com/yws/res/60510/2AE09DC7D9A24970A52A45FE10EB8BDF)]
主要包含两部分:
1、单词词典(Term Dictionary)
记录所有文档的单词,记录单词到倒排列表的关联关系。生产环境中单词数据量一般都比较大,可以通过B+树或者哈希拉链法实现,以满足高性能的插入或查询。
2、倒排列表(Posting List)
记录了单词对应的文档的一些倒排索引项信息。主要包括:
- 文档ID
- 词频(该单词在文档中出现的次数,用于相关性评分)
- 位置(Position,单词在文档分词中的位置,用于语句搜索)
- 偏移(Offset,记录单词开始结束的位置,实现高亮显示)
ES的json文档中的每个字段,默认都有自己的倒排索引。当然也可以指定对某些字段不做索引,这种做法的优点就是节省空间,缺点也显而易见,未被索引的字段是无法被搜索的。
二、分词器
1、analyzsis 与 analyzer
在ES中,是通过具体的分词器(analyzer)实现对全文本的转换,将器转换成一个个的单词,这整个过程就叫做分词(analyzsis)。
分词器是专门处理分词的一个组件,分词器主要由三部分组成:
- Character Filters,主要是对原始文本做处理,如去除html等
- Tokenizer,按照具体规则对文档进行切分
- Token Filter,对切分完的单词进行加工,如小写处理、删除stopwords,增加同义词等
ES中分词器主要有两大类:ES内置分词器、定制分词器。在生产环境中,需要结合实际情况已经业务需要选择正确的分词器,文档的写入以及读取都需要使用对应的分词器进行分析。
2、常见的内置分词器
分词器 | 基本介绍 |
---|---|
Standard Analyzer | 默认分词器,按词切分,小写处理,stopwords关闭 |
Simple Analyzer | 按照非字母切分(字符被过滤),小写处理 |
Stop Analyzer | 按词切分,停用词过滤(is、a、the),小写处理 |
Whitespace Analyzer | 按照空格切分,不做小写处理 |
Keyword Analyzer | 不做分词处理,直接将输入当作输出 |
Patter Analyzer | 正则表达式,默认\W+(非字符分隔) |
Language | 提供30+常见语言的分词器 |
Customer Analyzer | 自定义分词器 |
3、中文分词器
1)ICU analyzer
需要手动下载对应的插件,它提供了unicode可以更好的支持亚洲语言。
Elasticsearch-plugin install analysis-icu
2)IK
支持自定义词库,支持热更新分词词典
3)THULAC
清华大学自然语言处理和社会人文计算实验室提供的一套中文分词器
4、_analyze API
三种测试查看分词器分词效果的情况
1)直接使用_analyze
GET /_analyze
{
"analyzer":"standard",
"text":"This is a Test"
}
2)指定索引的具体的字段查看其分词效果
POST ${index_name}/_analyze
{
"filed":"title",
"text":"Mastering Elasticsearch"
}
3)自定义指定分词器查看分词效果
POST /_analyze
{
"tokenizer":"standard",
"filter":["lowercase"],
"text":"Mastering Elasticsearch"
}