elasticseach multi-field的实际用途
下面是multi-field的介绍:
multi_field 多域类型允许你对同一个值以映射的方式定义成多个基本类型 core_types . 这个非常有用,比如,如果你定义一个 string 类型的字段,你需要这个字段的分词一会是 analyzed ,但是有时候又希望该字段是 not_analyzed 类型的,通过使用 multi_field 就可以很方便的解决这个问题. 下面来看个例子:
{
"tweet" : {
"properties" : {
"name" : {
"type" : "multi_field",
"fields" : {
"name" : {"type" : "string", "index" : "analyzed"},
"untouched" : {"type" : "string", "index" : "not_analyzed"}
}
}
}
}
}
上面的例子,显示了我们是如何定义一个名为 name 的字段, 它的数据类型是 string 字符类型, 该字段映射了两次(实际物理上产生了2个索引字段),其中一个是以 name 的名称 定义为 analyzed 分词类型,另外一个定义成了名称为 untouched 的 not_analyzed 类型,即不分词处理.
字段访问
当使用 multi_field mapping定义之后, fields里面的和字段名称和外部的字段名称相同的字段定义会被当做该mult-field的默认字段(因为一个multi类型字段会被拆分成多个字段,所以,会有一个默认值),我们可以通过直接名称 name 或者使用 tweet.name 格式的方式来指定字段.
其它定义的不同名称的字段也可以通过使用特点的导航来指定(即使用“.”符合来分割),如: name.untouched, 或者还带上类型名称 tweet.name.untouched.
合并Merging
当使用更新mapping接口 put_mapping 的时候,一个基本类型(core type) mapping定义能够自动升级成 multi_field mapping定义. 这意味着旧的定义是普通的基本类型的mapping,通过保持默认字段一致(即定义的multi-field的默认字段定义保持为旧的mapping的定义),就能够升级为 multi_field 类型.
开始介绍下更具体的用法,一步一步的啊。
mapping的使用和分词的配置之前也介绍过,再重头来一遍吧。
这么个场景,之前在pinyin插件里面写的,拿过来:https://github.com/medcl/elasticsearch-analysis-pinyin
我们现在需要实现人名的搜索,可以除了通过中文,还可以通过拼音来进行搜索,怎么做呢?
“执行索引前,转换中文姓名,得到拼音,然后分别建两个字段,往里面写数据,不就可以了吗?”
土了吧,看我给你介绍新的玩法。
用multi-field和pinyin插件。
前提准备:插件安装什么的我就不说了,可以使用RTF,相关都配置做好了,直接可以用。
1.自定义分词,开始之前,需要先定义好分词,可以在配置文件里面定义,但是不灵活,定义完了之后,需要重启es,还一种方式就是动态的添加自定义分词,如下所示:
curl -XPOST http://localhost:9200/medcl/_close
curl -XPUT http://localhost:9200/medcl/_settings -d'
{
"index" : {
"analysis" : {
"analyzer" : {
"pinyin_analyzer" : {
"tokenizer" : ["my_pinyin"],
"filter" : ["standard","nGram"]
}
},
"tokenizer" : {
"my_pinyin" : {
"type" : "pinyin",
"first_letter" : "prefix",
"padding_char" : ""
}
}
}
}
}'
curl -XPOST http://localhost:9200/medcl/_open
上面自定义了一个名为my_pinyin的tokenizer,和名为pinyin_analyzer的analyzer,值得注意的是,修改索引的setting,需要先close索引,修改完之后,open就好了。
2.创建好索引,设置好analyzer,我们再来定义Type的,Type名称就用folks吧,有一个name字段,用来存姓名就好了。
curl -XPOST http://localhost:9200/medcl/folks/_mapping -d'
{
"folks": {
"properties": {
"name": {
"type": "multi_field",
"fields": {
"name": {
"type": "string",
"store": "no",
"term_vector": "with_positions_offsets",
"analyzer": "pinyin_analyzer",
"boost": 10
},
"primitive": {
"type": "string",
"store": "yes",
"analyzer": "keyword"
}
}
}
}
}
}'
上面定义了一个folks的Type,有一个字段名称为name,该字段数据类型为string,对象类型为multi-field,正因为类型是multi-field,它有了一些额外的参数可以进行设置,即fields,fields里面设置衍生字段的属性,可以是多个,每个都可以分别设置analyzer,store等参数,和core类型无异,如上,定义了一个name,使用的是pinyin analyzer和一个primitive,使用的是keyword analyzer,当想通过拼音搜索的时候,就对第一个字段name进行搜索就行了,如果需要完整匹配中文姓名,则对primitive字段进行搜索就行了。
elasticseach multi-field的实际用途的更多相关文章
- elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)
一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...
- elasticsearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解
一.快速入门1. 查看集群的健康状况http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 状 ...
- Query DSL for elasticsearch Query
Query DSL Query DSL (资料来自: http://www.elasticsearch.cn/guide/reference/query-dsl/) http://elasticsea ...
- Elasticsearch搜索之cross_fields分析
cross_fields类型采用了一种以词条为中心(Term-centric)的方法,这种方法和best_fields及most_fields采用的以字段为中心(Field-centric)的方法有很 ...
- web项目-easyui-datagrid使用汇总
一,引言 工作的需要,做了3年的wpf--,又因为项目的需求,回归到web的开发. ■ 3 years ago,vue是我三年前没用过的玩意儿. ■ 3 years ago,bootstrap组件 ...
- web项目 easyui-datagrid开发实践
一,引言 工作的需要,做了3年的wpf(mvvm)……,又因为项目的需求,回归到web的开发. ■ 3 years ago,vue是我三年前没用过的玩意儿. ■ 3 years ago,boots ...
- elasticsearch 口水篇(6) Mapping 定义索引
前面我们感觉ES就想是一个nosql数据库,支持Free Schema. 接触过Lucene.solr的同学这时可能会思考一个问题——怎么定义document中的field?store.index.a ...
- ecCodes 学习 利用ecCodes fortran90 api对GRIB文件进行读写
参考 https://www.ecmwf.int/assets/elearning/eccodes/eccodes2/story_html5.htmlhttps://confluence.ecmwf. ...
- Elasticsearch-mapper 基于注解方式生成mapping(2.0以上)
Elasticsearch生成mapping的方式上有多种方式,我们可以把mapping做成配置文件,也可以用spring-data-elasticsearch基于注解生成. 在基于注解生成这种方式上 ...
- Java 面向对象(十四)
反射 反射是框架设计的灵魂 一.类的加载时机 当程序要使用某个类时,如果该类还未被加载到内存中,系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载 :就是指将class文件读入内存,并为 ...
随机推荐
- PowerDesigner 16.5对SQL Server 2012 生成数据库时"不支持扩展属性"问题
团队合作设计一套系统数据模型,创建了PDM后,Table.View.Store Procedure等都创建好了,且创建了多个Schema方便管理这些数据库对象,但Table.view.Column等对 ...
- 实战:ajax带参数请求slim API
restful api 支持get,post,put,delete等方法,那么jquery客户端怎么去实现呢?涉及到跨域又怎么办? 很多时候需要传递一个token(api_key) 去识别用户身份,获 ...
- linux下的daemon进程
转自:http://www.cnblogs.com/xuxm2007/archive/2011/07/29/2121280.html #include <unistd.h> int d ...
- 利用__index和__newindex实现默认值表、监控表、只读表
__index和__newindex实际上相当于是在读写表的时候分别加了一道过滤的逻辑,让读写表的操作可以被监控或说回调,利用这个特性可以实现一些带有特殊功能的表. 带有默认值的表: setdefau ...
- 去掉NSString中的HTML标签
经常出现字符串带有html标签.下面有个方法一步到位去掉HTML标签 <span style="font-family: 'comic sans ms', sans-serif; co ...
- [OpenCV] Basic data types - Matrix
http://docs.opencv.org/2.4.13/ Basis 矩形 "modules/core/src/drawing.cpp" CV_IMPL void cvRect ...
- LoRaWAN协议(二)--LoRaWAN MAC数据包格式
名词解析 上行:终端的数据发送经过一个或多个网关中转到达网络服务器. 下行:由网络服务器发送给终端设备,每条消息对应的终端设备是唯一确定的,而且只通过一个网关中转. LoRaWAN Classes L ...
- centos nfs配置--转载
http://www.centos.org/docs/5/html/Deployment_Guide-en-US/s1-nfs-client-config.html 18.6. NFS Server ...
- 结对编程之Fault、Error、Failure
1.结对说明 结对对象:刘世麟 博客地址:http://www.cnblogs.com/liushilin/ 双方贡献:1:1 2.题目要求 构造程序,分别是: •不能触发Faul ...
- IOS开发UI基础UISegment属性
UISegment属性 1.segmentedControlStyle设置segment的显示样式.typedef NS_ENUM(NSInteger, UISegmentedControlStyle ...