写在前面
本文是基于版本6.1。如有出入请以官方文档为准https://www.elastic.co/guide/en/elasticsearch/reference/6.6/starting-elasticsearch.html。
中文文档:http://doc.codingdict.com/elasticsearch/319/
注意:根据自己使用的版本,查看对应版本的文档。
基本概念
- document(文档):类比数据库表中一行数据(必须要有一个唯一的标识,如果没有则会自动生成)。
- type(类型):6.0之前类比数据库中一张表,6.x之后没有这个概念,但是依旧存有这个字段(后续的版本会移除)。
- index(索引):6.0之前类比数据库的datebase,6.x后移除了type概念,所以类比数据库一张表。
- mapping:类比数据库中表结构的定义,在es中是对index索引进行结构定义。
索引
索引分为正排索引和倒排索引,如上图,左边为正排索引,右边为倒排索引。
- 正排索引:根据文档ID映射到内容。
- 倒排索引:根据内容分词出来的单词映射到文档ID,列表除了文档ID还有单词在文档的偏移量(位置),出现的次数等信息用于计算相关性。
搜索的过程:通过倒排索引获取到文档id,然后再通过正排索引获取到文档内容。
mapping
参数详解https://www.elastic.co/guide/en/elasticsearch/reference/6.1/mapping-params.html
查看test_index索引的mapping结构
GET test_index/_mapping
配置含有mapping的索引。
PUT test_index
{
"mappings": {
"_doc": {
"dynamic": "false",
"properties": {
"speaker": {"type": "keyword"},
"tutke": {"type": "text"}
}
}
}
}
dynamic三个参数:
true
:动态添加新的字段(即mappings会有改动)false
:不会添加新的字段(即mappings不会有改动),但是新的数据会存入进去。strict
:如果遇到新字段抛出异常
分词
概念:分词是将文本转化为一系列单词的过程。也成为文本分析。如将 “elasticSearch是最流行的搜索引擎” 转化为"elasticsearch","流行",“搜索引擎”。这是通过分析器(analyzer)实现的,同时分析器也分为好多种,不同的分析器分解出来的单词会不一样,根据自己的实际需求去选择文本分析器。如以上结果是通过ik_max_word分析器实现的。
指定analyzer测试分词效果
POST /_analyze
{
"analyzer": "standard",
"text": "elasticSearch是最流行的搜索引擎"
}
standard是es自带的分析器,如想要查看更多es自带的分析器和分析效果,请看官方文档Analyzers说明。其中不分词的分析器是keyword analyze。
常用的中文分词器:
- IK分词器(https://github.com/medcl/elasticsearch-analysis-ik)
- jieba分词器(https://github.com/sing1ee/elasticsearch-jieba-plugin)。
指定索引中的字段测试分词效果
POST test_index/_analyze
{
"field": "searchKeyWord",
"text": "elasticSearch是最流行的搜索引擎"
}
理解索引时分词和查询时分词
当数据存入到es中会进行索引时分词,生成一列倒排索引。如:”中国人民” 使用ik分析器会生成”中国人民“,”中国人“,”人民“,”中国“,“国人”这一列倒排索引存到es中。这是我们输入中国进行查询(假设数据存在以下索引和字段):
GET test_index/_search
{
"query": {
"match": {
"tutke": "中国"
}
}
}
“中国好”会进行查询时分词,分析器默认是匹配字段tutke的索引时分词用的分析器,即也是ik分析器,那么会对“中国好”分词为“中国“,”好”,和存在es的倒排索引进行匹配。
一个字段支持定义多个分析器生成的倒排索引,以便查询时可以选择使用哪种分析器生成的倒排索引进行匹配。
PUT test_index
{
"mappings": {
"_doc": {
"properties": {
"tutke": {
"type": "text",
"fields":{
"dk_ik":{
"type":"text",
"analyzer":"ik_max_word"
},
"dk_keyword":{
"type":"keyword"
}
}
}
}
}
}
}
此时tutke会生成三种倒排索引,默认的standard分析器生成的,名称为dk_ik的ik分析器生成的,名称为dk_keyword的keyword分析器生成的。
GET test_index/_search
{
"query": {
"match": {
"tutke.dk_ik": "中国"
}
}
}
使用方式:字段.分析器名称。tutke.dk_ik表示将匹配ik分析器生成的倒排索引。