• -------------------------------------------------------------
  • ====================================

elasticseach multi-field的实际用途

elasticsearch dewbay 5年前 (2019-04-12) 1652次浏览 已收录 0个评论 扫描二维码

下面是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 字段进行搜索就行了。


露水湾 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:elasticseach multi-field的实际用途
喜欢 (0)
[]
分享 (0)
关于作者:
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址