Elasticsearch入门-2
为什么primary shard数量不可变?
原因:假如我们的集群在初始化的时候有5个primary shard,我们往里边加入一个document id=5,假如hash(5)=23,这时该document 将被加入 (shard=23%5=3)P3这个分片上。如果随后我们给es集群添加一个primary shard ,此时就有6个primary shard,当我们GET id=5 ,这条数据的时候,es会计算该请求的路由信息找到存储他的 primary shard(shard=23%6=5) ,根据计算结果定位到P5分片上。而我们的数据在P3上。所以es集群无法添加primary shard,但是可以扩展replicas shard。
Ik分词器
Lucene自带中文分词器
**StandardAnalyzer:**单字分词:就是按照中文一个字一个字地进行分词。
**CJKAnalyzer:**二分法分词:按两个字进行切分
**SmartChineseAnalyzer:**对中文支持较好,但扩展性差,扩展词库和禁用词库等不好处理
测试自带分词器:单子拆分
POST /_analyze
{
"text":"测试分词器,后边是测试内容:spring cloud实战"
}
IK-analyzer:最新版在https://code.google.com/p/ik-analyzer/
安装IK分词器
使用IK分词器可以实现对中文分词的效果。
1、下载IK分词器:(Github地址:https://github.com/medcl/elasticsearch-analysis-ik)
2、解压,并将解压的文件拷贝到ES安装目录的plugins下的ik(重命名)目录下,重启es
Ik两种分词模式
ik分词器有两种分词模式:ik_max_word和ik_smart模式。
ik_max_word
会将文本做最细粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民大会堂、人民、共和国、大会堂、大会、会堂等词语。
ik_smart
会做最粗粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。
自定义词库
1、iK分词器自带的main.dic的文件为扩展词典,stopword.dic为停用词典。
2、也可以上边的目录中新建一个my.dic文件(注意文件格式为utf-8(不要选择utf-8 BOM))
配置文件中 配置my.dic
field详细介绍
field的属性介绍
type:
通过type属性指定field的类型。
"name":{
"type":"text"
}
analyzer:
通过analyzer属性指定分词模式。
"name": {
"type": "text",
"analyzer":"ik_max_word"
}
上边指定了analyzer是指在索引和搜索都使用ik_max_word,如果单独想定义搜索时使用的分词器则可以通过search_analyzer属性。
对于ik分词器建议是索引时使用ik_max_word将搜索内容进行细粒度分词,搜索时使用ik_smart提高搜索精确性。
"name": {
"type": "text",
"analyzer":"ik_max_word",#生成索引目录时
"search_analyzer":"ik_smart"#检索时
}
index:
通过index属性指定是否索引。
默认为index=true,即要进行索引,只有进行索引才可以从索引库搜索到。
"pic": {
"type":"text",
"index":false
}
删除索引,重新创建映射,将pic的index设置为false,尝试根据pic去搜索,结果搜索不到数据
source:
如果某个字段内容非常多,业务里面只需要能对该字段进行搜索,比如:商品描述。查看文档内容会再次到mysql或者hbase中取数据,把大字段的内容存在Elasticsearch中只会增大索引,这一点文档数量越大结果越明显,如果一条文档节省几KB,放大到亿万级的量结果也是非常可观的。
如果只想存储某几个字段的原始值到Elasticsearch,可以通过incudes参数来设置,在mapping中的设置如下:
POST /test/course/_mapping
{
"_source": {
"includes":["description"]
},
"properties":{...}
}
同样,可以通过excludes参数排除某些字段:
POST /test/course/_mapping
{
"_source": {
"excludes":["description"]
},
"properties":{...}
}
常用field类型
text文本字段
创建新映射
POST /test/course/_mapping
{
"_source": {
"includes":["description"]
}
"properties": {
"name": {
"type": "text",
"analyzer":"ik_max_word",
"search_analyzer":"ik_smart"
},
"description": {
"type": "text",
"analyzer":"ik_max_word",
"search_analyzer":"ik_smart"
},
"pic":{
"type":"text",
"index":false
}
}
}
插入文档:
POST /test/course/1
{
"name":"python从入门到放弃",
"description":"人生苦短,我用Python",
"pic":"250.jpg"
}
查询测试:
GET /test/course/_search?q=name:放弃
GET /test/course/_search?q=description:人生
GET /test/course/_search?q=pic:250.jpg
name和description都支持全文检索,pic不可作为查询条件
keyword关键字字段
上边介绍的text文本字段在映射时要设置分词器,keyword字段为关键字字段,通常搜索keyword是按照整体搜索,所以创建keyword字段往索引目录写时是不进行分词。比如:邮政编码、手机号码、身份证等。keyword字段通常用于过虑、排序、聚合等。
field属性的设置标准
属性 | 标准 |
---|---|
type | 是否有意义 |
index | 是否搜索 |
source | 是否展示 |