Elasticsearch入门 -2

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_wordik_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是否展示
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值