上周的一篇文章说了IK分词器的安装,但是我们如何在索引和搜索时去使用ik分词器呢?如何指定field的类型?比如日期类型、数值类型等。
如果没有安装Ik分词器的话可以看一下这篇文章→
首先,我们要知道ES6.2之后的核心的字段类型:
1、type
通过type属性指定field的类型。
"name":{
"type":"text"
}
2、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"#检索时
}
3、index
"pic": {
"type":"text",
"index":false
}
4、source
如果某个字段内容非常多,业务里面只需要能对该字段进行搜索,比如:商品描述。查看文档内容会再次到mysql或者hbase中取数据,把大字段的内容存在Elasticsearch中只会增大索引,这一点文档数量越大结果越明显,如果一条文档节省几KB,放大到亿万级的量结果也是非常可观的。
如果只想存储某几个字段的原始值到Elasticsearch,可以通过incudes参数来设置,在mapping中的设置如下:
注意:设置之前要先创建一个index,然后进行以下设置
POST /java06/course/_mapping
{
"_source": {
"includes":["description"]
}
}
同样,可以通过excludes参数排除某些字段:
POST /java06/course/_mapping
{
"_source": {
"excludes":["description"]
}
}
例如:
1、创建新映射:
POST /java06/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
}
}
}
2、插入文档:
POST /java06/course/1
{
"name":"python从入门到放弃",
"description":"人生苦短,我用Python",
"pic":"250.jpg"
}
3、查询测试
GET /java06/course/_search?q=name:放弃
GET /java06/course/_search?q=description:人生
GET /java06/course/_search?q=pic:250.jpg
最后,我们发现他的结果:name和description都支持全文检索,pic不可作为查询条件
例如:
1、更改映射:
POST /java06/course/_mapping
{
"properties": {
"studymodel":{
"type":"keyword"
}
}
}
2、插入文档
PUT /java06/course/2
{
"name": "java编程基础",
"description": "java语言是世界第一编程语言",
"pic":"250.jpg",
"studymodel": "2010年01月"
}
3、根据name查询文档
GET /java06/course/_search?q=studymodel:2010年01月
name是keyword类型,所以查询方式是精确查询。
日期类型不用设置分词器,通常日期类型的字段用于排序。 format 通过format设置日期格式,多个格式使用双竖线||分隔, 每个格式都会被依次尝试, 直到找到匹配的
例如:
1、设置允许date字段存储年月日时分秒、年月日及毫秒三种格式。
POST /java06/course/_mapping
{
"properties": {
"timestamp": {
"type": "date",
"format": "yyyy-MM-dd"
}
}
}
2、插入文档
PUT /java06/course/3
{
"name": "spring开发基础",
"description": "spring 在java领域非常流行,java程序员都在用。",
"studymodel": "201001",
"pic":"250.jpg",
"timestamp":"2018-07-04 18:28:58"
}
es中的数字类型经过分词(特殊)后支持排序和区间搜索
例如:
1、更新已有映射:
POST /java06/course/_mapping
{
"properties": {
"price": {
"type": "float"
}
}
}
2、插入文档
PUT /java06/course/3
{
"name": "spring开发基础",
"description": "spring 在java领域非常流行,java程序员都在用。",
"studymodel": "201001",
"pic":"250.jpg",
"price":38.6
}
因篇幅问题不能全部显示,请点此查看更多更全内容