笔记十二: 显示 Mapping 设置与常见参数

如何显示定义一个Mapping

    PUT movies
    {
        "mappings" : {
            // define your mappings here
        }
    }

自定义Mapping的一些建议

  • 可以参考API手册,纯手写
  • 为了减少输入的工作量,减少出错率,依照以下步骤
    • 创建一个临时的index,写入一些样本数据
    • 通过访问 Mapping API获得该临时文件的动态 Mapping 定义
    • 修改后用,使用该配置创建的索引
    • 删除临时索引

控制当前字段是否被索引

  • index - 控制当前字段是否被索引。默认为true。如果设置成false,该字段不可被搜索。
    PUT users
    {
      "mappings" : {
        "properties" : {
          "firstName" : {
            "type" : "text"
          },
          "lastName" : {
            "type" : "text"
          },
          "mobile" : {
            "type" : "text",
            "index": false
          }
        }
      }
    }

Index Options

  • 四种不同级别的 Index Options 配置,可以控制倒排索引记录的内容
    • docs - 记录 doc id
    • freqs - 记录 doc id 和 term frequencies
    • positions - 记录 doc id / term frequencies / term position
    • offsets - doc id / term frequencies / term posistion / character offects
  • Text 类型默认记录 postions,其他默认为docs
  • 记录内容越多,占用存储空间越大

null_value

  • 需要对NULL 值实现搜索
  • 只有 Keyword 类型支持设定 Null_Value
    DELETE users
    PUT users
    {
      "mappings" : {
        "properties" : {
          "firstName" : {
            "type" : "text"
          },
          "lastName" : {
            "type" : "text"
          },
          "mobile" : {
            "type" : "keyword", //这个如果是text 无法设置为空
            "null_value": "NULL"
          }
        }
      }
    }
    PUT users/_doc/2
    {
    "firstName":"Li",
    "lastName": "Sunke",
    "mobile": null
    }
    GET users/_search?q=mobile:NULL
    //搜索结果
    "_source" : {
            "firstName" : "Li",
            "lastName" : "Sunke",
            "mobile" : null
          }

    copy_to

  • _all 在 7中已经被 copy_to 所替代
  • 满足一些特定的搜索需求
  • copy_to 将字段的数值拷贝到目标字段,实现类似 _all 的作用
  • copy_to 的目标字段不出现在_source 中
    DELETE users
    PUT users
    {
    "mappings": {
      "properties": {
        "firstName":{
          "type": "text",
          "copy_to": "fullName"
        },
        "lastName":{
          "type": "text",
          "copy_to": "fullName"
        }
      }
    }
    }
    PUT users/_doc/1
    {
    "firstName":"Li",
    "lastName": "Sunke"
    }
    //没有新建字段
    GET users/_doc/1
    {
    "_index" : "users",
    "_type" : "_doc",
    "_id" : "1",
    "_version" : 1,
    "_seq_no" : 0,
    "_primary_term" : 1,
    "found" : true,
    "_source" : {
      "firstName" : "Li",
      "lastName" : "Sunke"
    }
    }
    GET users/_search?q=fullName:(Li sunke)

数组类型

  • Elasticsearch 中不提供专门的数组类型。但是任何字段,都可以包含多个相同类型的数值
    DELETE users
    PUT users/_doc/1
    {
    "name":"onebird",
    "interests":"reading"
    }
    PUT users/_doc/1
    {
    "name":"twobirds",
    "interests":["reading","music"]
    }
    GET users/_mapping 
    //部分代码
    "interests" : {
            "type" : "text", //类型还是text
            "fields" : {
              "keyword" : {
                "type" : "keyword",
                "ignore_above" : 256
              }
            }
          }

PS: text类型会使用默认分词器分词,当然你也可以为他指定特定的分词器。如果定义成keyword类型,那么默认就不会对其进行分词。

es对字符串类型的mapping设定,会将其定义成text,同时为他定义一个叫做keyword的子字段。keyword只是他的名字,你也可以定义成kw。这个字段的类型是keyword(这是一个类型的关键字)

多字段类型情况下,你可以查询 title,也可以查询title.keyword查询类型为keyword的子字段

es
本作品采用《CC 协议》,转载必须注明作者和本文链接
快乐就是解决一个又一个的问题!
CrazyZard
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!