zoukankan      html  css  js  c++  java
  • 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字段进行搜索就行了。

  • 相关阅读:
    记录一次在 VirtualBox的添加共享windows文件后,发现没有共享文件的事
    linux 压缩解压缩命令
    关于erlang中的timer:tc/3
    python基础:while循环,for循环
    grep和正则表达式参数
    grep和正则表达式
    nginx反向代理三台web
    安装nginx包
    部署samba
    samba了解
  • 原文地址:https://www.cnblogs.com/klsw/p/5567442.html
Copyright © 2011-2022 走看看