ElasticSearch (ES)

目录

一、ElasticSearch介绍

1.什么是ElasticSearch

2.ElasticSearch原理

二、安装ElasticSearch

 1.环境需求

2.下载ES 

3.安装ES

 3.修改配置文件

4.ES启动和关闭

5.解决遇到的问题

6.测试

三.安装Kibana

3.1.什么是Kibana

3.2 Kibana的安装和配置

3.2.1.下载

3.2.2.安装

3.2.3.修改配置

3.2.4.启动

3.2.5.测试

四.安装head

4.1.什么是head

4.2.安装

4.3.测试

五.ES快速入门

5.1.index管理

5.1.1.创建index

5.1.2.修改index

5.1.3.删除index

5.2.mapping管理

5.2.1 创建mapping

5.2.2.查询mapping

5.2.3.更新mapping

5.2.4.删除mapping

5.3.document管理

5.3.1.创建document

5.3.2.查询document

5.3.3.删除Document

5.4.ES读写过程

5.4.1.documnet routing(数据路由)

5.4.4.为什么primary shard数量不可变?

5.5.luke查看ES的逻辑结构

六.IK分词器

6.1.测试分词器

6.2.中文分词器

6.2.1.Lucene自带中文分词器

6.2.2.第三方中文分析器

6.3.安装IK分词器

6.4.两种分词模式

6.5.自定义词库

七.field详细介绍

7.1.field的属性介绍

7.1.1.type:

7.1.2.analyzer:

7.1.3.index:

7.1.4.source:

7.2.常用field类型

7.2.1.text文本字段

7.2.2.keyword关键字字段

7.2.3.date日期类型

7.2.4.Numeric类型

7.3.field属性的设置标准

7.4 field主要知识总结


一、ElasticSearch介绍

1.什么是ElasticSearch

   ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个基于RESTful web接口的分布式全文搜索引擎。ElasticSearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。

1、elasticsearch是一个基于Lucene的分布式全文检索服务器。

2、elasticsearch隐藏了Lucene的复杂性,对外提供Restful 接口来操作索引、搜索。

2.ElasticSearch原理

 正排索引:查字典从第一页开始找,直到找到为止(文档---->关键字)

 倒排索引(Inverted index):也常被称为反向索引,倒排索引是从关键字到文档的映射(已知关键   字求文档)。

倒排索引表的组成:
                term
                trem------------------------>document
                document

分词列表的特点:1.不重复    2.“的 地 得 a an the”语气词不参加分词    3.不搜索的filed不参加分词,eg:图片地

逻辑结构部分是一个倒排索引表,由三部分组成:

1、将搜索的文档最终以Document方式存储起来。

2、将要搜索的文档内容分词,所有不重复的词组成分词列表。

3、每个分词和docment都有关联

二、安装ElasticSearch

 1.环境需求

1、jdk必须是jdk1.8.0_131以上版本。

2、ElasticSearch 需要至少4096 的线程池和 262144字节以上空间的虚拟内存才能正常启动,所以需要为虚拟机分配至少1.5G以上的内存

3、从5.0开始,ElasticSearch 安全级别提高了,不允许采用root帐号启动

4、Elasticsearch的插件要求至少centos的内核要3.5以上版本

2.下载ES 

(1)下载:ElasticSearch官网:免费且开放的搜索:Elasticsearch、ELK 和 Kibana 的开发者 | Elastic

(2)设置虚拟机的内存:  >=1.5G

   (3) 创建用户

        从5.0开始,ElasticSearch 安全级别提高了,不允许采用root帐号启动,所以我们要添加一   个用户。

①创建elk用户组

groupadd elk

②创建用户admin

useradd admin
passwd admin

③将admin用户添加到elk组

usermod -G elk admin

④为用户分配权限

#chown将指定文件的拥有者改为指定的用户或组 -R处理指定目录以及其子目录下的所有文件
chown -R admin:elk /usr/upload
chown -R admin:elk /usr/local

⑤切换用户

su admin

3.安装ES

(1)解压并安装

tar -zxvf elasticsearch-6.2.3.tar.gz -C /usr/local

(2)ES的目录结构

bin 目录:可执行文件包
config 目录:配置相关目录
lib 目录:ES 需要依赖的 jar 包,ES 自开发的 jar 包
logs 目录:日志文件相关目录
modules 目录:功能模块的存放目录,如aggs、reindex、geoip、xpack、eval
plugins 目录:插件目录包,三方插件或自主开发插件
data 目录:在 ES 启动后,会自动创建的目录,内部保存 ES 运行过程中需要保存的数据。

(3)配置文件

elasticsearch.yml:用于配置Elasticsearch运行参数

jvm.options:用于配置Elasticsearch JVM设置

log4j2.properties:用于配置Elasticsearch日志

 3.修改配置文件

(1)修改elasticsearch.yml

cluster.name: power_shop
node.name: power_shop_node_1
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301"]
path.data: /usr/local/elasticsearch-6.2.3/data
path.logs: /usr/local/elasticsearch-6.2.3/logs
http.cors.enabled: true
http.cors.allow-origin: /.*/

(2) 修改jvm.options

设置最小及最大的JVM堆内存大小:

在jvm.options中设置 -Xms和-Xmx:

1) 两个值设置为相等

2) 将Xmx 设置为不超过物理内存的一半。

默认内存占用太多了,我们调小一些:

-Xms512m
-Xmx512m

(3)log4j2.properties

 日志文件设置,ES使用log4j,注意日志级别的配置。

4.ES启动和关闭

(1)启动

./elasticsearch
#或
./elasticsearch -d   

(2)关闭

ps-ef|grep elasticsearch

kill -9 pid

5.解决遇到的问题

(1)解决内核问题

修改elasticsearch.yml文件,在最下面添加如下配置:

bootstrap.system_call_filter: false

(2)解决文件创建权限的问题

[1]: max file descriptors [4096] for elasticsearch process likely too low, increase to at least [65536]

Linux 默认来说,一般限制应用最多创建的文件是 4096个。但是 ES 至少需要 65536 的文件创建权限。我们用的是admin用户,而不是root,所以文件权限不足。

使用root用户修改配置文件:

vim /etc/security/limits.conf

追加下面的内容
* soft nofile 65536
* hard nofile 65536

(3)解决线程开启限制问题

[2]: max number of threads [1024] for user [admin] is too low, increase to at least [4096]

默认的 Linux 限制 root 用户开启的进程可以开启任意数量的线程,其他用户开启的进程可以开启1024 个线程。必须修改限制数为4096+。因为 ES 至少需要 4096 的线程池预备。

如果虚拟机的内存是 1G,最多只能开启 3000+个线程数。至少为虚拟机分配 1.5G 以上的内存。

使用root用户修改配置:

 su root
 vim /etc/security/limits.conf:
  添加
 *  soft nproc  4096
 *  hard nproc  4096

(4)解决虚拟内存问题

[3]: max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]

ES 需要开辟一个 262144字节以上空间的虚拟内存。Linux 默认不允许任何用户和应用直接开辟虚拟内存

 su root
 vim /etc/sysctl.conf:
 vm.max_map_count=655360
 sysctl -p

6.测试

    ES 中只要启动了任意一个 ES 应用就是启动了一个 ES的 cluster 集群。默认的 ES集群命名为 elasticsearch。如果启动了多个应用(可以在多个节点或单一节点上启动多个应用),默认的ES 会自动找集群做加入集群的过程。

浏览器访问:http://192.168.xxx.xxx:9200

返回结果如下:

{
  "name" : "power_shop_node_1", # node name 结点名称。随机分配的结点名称
  "cluster_name" : "power_shop", # cluster name 集群名称。 默认的集群名称
  "cluster_uuid" : "RqHaIiYjSoOyrTGq3ggCOA", # 集群唯一 ID
  "version" : {
    "number" : "6.2.3", #版本号
    "build_hash" : "c59ff00", 
    "build_date" : "2018-03-13T10:06:29.741383Z",#发布日期
    "build_snapshot" : false,#是否快照版本
    "lucene_version" : "7.2.1",#lucene版本号
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

三.安装Kibana

3.1.什么是Kibana

Kibana是ES提供的一个基于Node.js的管理控制台, 可以很容易实现高级的数据分析和可视化,以图标的形式展现出来。

kibana可以用来编辑请求语句的,方便学习操作es的语法。有时在进行编写程序,写到查询语句时,往往我会使用kibana进行书写,然后再粘贴到程序中。(不容易出错)

3.2 Kibana的安装和配置

3.2.1.下载

ElasticSearch官网:免费且开放的搜索:Elasticsearch、ELK 和 Kibana 的开发者 | Elastic

3.2.2.安装

在window中安装Kibana很方便,解压即安装

3.2.3.修改配置

修改config/kibana.yml配置:

server.port: 5601
server.host: "0.0.0.0" #允许来自远程用户的连接
elasticsearch.url: http://192.168.204.132:9200 #Elasticsearch实例的URL 

3.2.4.启动

./bin/kibana

3.2.5.测试

浏览器访问:http://127.0.0.1:5601http://127.0.0.1:5601

四.安装head

4.1.什么是head

head插件是ES的一个可视化管理插件,用来监视ES的状态,并通过head客户端和ES服务进行交互,比如创建映射、创建索引等。从ES6.0开始,head插件支持使得node.js运行。

4.2.安装

1、下载head

下载地址:GitHub - mobz/elasticsearch-head: A web front end for an elastic search cluster

2、运行

npm run start

4.3.测试

浏览器访问:Node ExporterNode Exporter Node Exporter

五.ES快速入门

ES作为一个索引及搜索服务,对外提供丰富的REST接口,快速入门部分的实例使用kibana来测试,目的是对ES的使用方法及流程有个初步的认识。

5.1.index管理

5.1.1.创建index

索引库。包含若干相似结构的 Document 数据,相当于数据库的database。

语法:PUT /index_name

如:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">PUT</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span>
{
  <span style="color:#000000">"settings"</span>: {
    <span style="color:#000000">"number_of_shards"</span>: <span style="color:#116644">2</span>,
    <span style="color:#000000">"number_of_replicas"</span>: <span style="color:#116644">1</span>
  }
}</span></span>

number_of_shards - 表示一个索引库将拆分成多片分别存储不同的结点,提高了ES的处理能力

number_of_replicas - 是为每个 primary shard分配的replica shard数,提高了ES的可用性,如果只有一台机器,设置为0

效果:

5.1.2.修改index

注意:索引一旦创建,primary shard 数量不可变化,可以改变replica shard 数量。

语法:PUT /index_name/_settings

如:

PUT /java06/_settings
{
  "number_of_replicas" : 1
}

ES 中对 shard 的分布是有要求的,有其内置的特殊算法:

Replica shard 会保证不和他的那个 primary shard 分配在同一个节点上;如过只有一个节点,则此案例执行后索引的状态一定是yellow。

5.1.3.删除index

DELETE /java06[, other_index]

5.2.mapping管理

映射,创建映射就是向索引库中创建field(类型、是否索引、是否存储等特性)的过程,下边是document和field与关系数据库的概念的类比:

elasticsearch关系数据库
index(索引库)database(数据库)
type(类型)table(表)
document(文档)row(记录)
field(域)column(字段)

注意:6.0之前的版本有type(类型)概念,type相当于关系数据库的表,ES6.x 版本之后,type概念被弱化ES官方将在ES7.0版本中彻底删除type。

5.2.1 创建mapping

语法:POST /index_name/type_name/_mapping

如:

POST /java06/course/_mapping
{
  "properties": {
     "name": {
        "type": "text"
     },
     "description": {
        "type": "text"
     },
     "studymodel": {
        "type": "keyword"
     }
  }
}

效果:

5.2.2.查询mapping

查询所有索引的映射:

GET /java06/course/_mapping

5.2.3.更新mapping

映射创建成功可以添加新字段,已有字段不允许更新。

5.2.4.删除mapping

通过删除索引来删除映射。

5.3.document管理

5.3.1.创建document

ES中的文档相当于MySQL数据库表中的记录。

5.3.1.1.POST语法

此操作为 ES 自动生成 id 的新增 Document 方式。

语法:POST /index_name/type_name/id

如:

POST /java06/course/1
{
  "name":"python从入门到放弃",
  "description":"人生苦短,我用Python",
  "studymodel":"201002"
}
​
POST /java06/course
{
  "name":".net从入门到放弃",
  "description":".net程序员谁都不服",
  "studymodel":"201003"
}

5.3.1.2.PUT语法

此操作为手工指定 id 的 Document 新增方式。

语法:PUT/index_name/type_name/id{field_name:field_value}

如:

PUT /java06/course/2
{
  "name":"php从入门到放弃",
  "description":"php是世界上最好的语言",
  "studymodel":"201001"
}

结果:

{
  "_index": "test_index", 新增的 document 在什么 index 中,
  "_type": "my_type", 新增的 document 在 index 中的哪一个 type 中。
  "_id": "1", 指定的 id 是多少
  "_version": 1, document 的版本是多少,版本从 1 开始递增,每次写操作都会+1
  "result": "created", 本次操作的结果,created 创建,updated 修改,deleted 删除
  "_shards": { 分片信息
      "total": 2, 分片数量只提示 primary shard
      "successful": 1, 数据 document 一定只存放在 index 中的某一个 primary shard 中
      "failed": 0
  },
  "_seq_no": 0, 
  "_primary_term": 1
}

通过head查询数据:

5.3.2.查询document

语法:

GET /index_name/type_name/id

GET /index_name/type_name/_search?q=field_name:field_value

如:根据课程id查询文档

GET /java06/course/1

如:查询所有记录

GET /java06/course/_search

如:查询名称中包括php 关键字的的记录

GET /java06/course/_search?q=name:门

结果:

{
  "took": 1, # 执行的时长。单位毫秒
  "timed_out": false, # 是否超时
  "_shards": { # shard 相关数据
    "total": 1, # 总计多少个 shard
    "successful": 1, # 成功返回结果的 shard 数量
    "skipped": 0,
    "failed": 0
  },
  "hits": { # 搜索结果相关数据
    "total": 3, # 总计多少数据,符合搜索条件的数据数量
    "max_score": 1, # 最大相关度分数,和搜索条件的匹配度
    "hits": [# 具体的搜索结果
      {
        "_index": "java06",# 索引名称
        "_type": "course", # 类型名称
        "_id": "1",# id 值
        "_score": 1, # 匹配度分数,本条数据匹配度分数
        "_source": { # 具体的数据内容
          "name": "php从入门到放弃",
          "description": "php是世界上最好的语言",
          "studymodel": "201001"
        }, {
            "_index": "java06",
            "_type": "course",
            "_id": "2",
            "_score": 0.13353139,
            "_source": {
                "name": "php从入门到放弃",
                "description": "php是世界上最好的语言",
                "studymodel": "201001"
            }
        }, {
            "_index": "java06",
            "_type": "course",
            "_id": "6ljFCnIBp91f7uS8FkjS",
            "_score": 0.13353139,
            "_source": {
                "name": ".net从入门到放弃",
                "description": ".net程序员谁都不服",
                "studymodel": "201003"
            }
        }
     ]
  }
}

5.3.3.删除Document

ES 中执行删除操作时,ES先标记Document为deleted状态,而不是直接物理删除。当ES 存储空间不足或工作空闲时,才会执行物理删除操作,标记为deleted状态的数据不会被查询搜索到(ES 中删除 index ,也是标记。后续才会执行物理删除。所有的标记动作都是为了NRT(近实时)实现)

语法:DELETE /index_name/type_name/id

如:

DELETE /java06/course/3

结果:

{
  "_index": "java06",
  "_type": "course",
  "_id": "2",
  "_version": 2,
  "result": "deleted",
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 3,
  "_primary_term": 1
}

5.4.ES读写过程

5.4.1.documnet routing(数据路由)

当客户端创建document的时候,es需要确定这个document放在该index哪个shard上,这个过程就是document routing。

路由过程:

    路由算法:shard = hash(5) %number_of_primary_shards

    id:document的_id,可能是手动指定,也可能是自动生成,决定一个document在哪个shard上

    number_of_primary_shards主分片數量。

5.4.2.为什么primary shard数量不可变?

原因:假如我们的集群在初始化的时候有5个primary shard,我们往里边加入一个document id=5,假如hash(5)=23,这时该document 将被加入 (shard=23%5=3)P3这个分片上。如果随后我们给es集群添加一个primary shard ,此时就有6个primary shard,当我们GET id=5 ,这条数据的时候,es会计算该请求的路由信息找到存储他的 primary shard(shard=23%6=5) ,根据计算结果定位到P5分片上。而我们的数据在P3上。所以es集群无法添加primary shard,但是可以扩展replicas shard。

5.5.luke查看ES的逻辑结构

  1. 拷贝elasticsearch-6.2.3/data到windows

  2. 双击luke.bat,启动luke

  3. 使用luke打开data\nodes\0\indices路径

六.IK分词器

6.1.测试分词器

在添加文档时会进行分词,索引中存放的就是一个一个的词(term),当你去搜索时就是拿关键字去匹配词,最终找到词关联的文档。

测试当前索引库使用的分词器:

POST /_analyze
{
  "text":"测试分词器,后边是测试内容:spring cloud实战"
}

结果如下:

会发现分词的效果将“测试”这个词拆分成两个单字“测”和“试”,这是因为当前索引库使用的分词器对中文就是单字分词。  

6.2.中文分词器

6.2.1.Lucene自带中文分词器

StandardAnalyzer:

单字分词:就是按照中文一个字一个字地进行分词。如:“我爱中国”, 效果:“我”、“爱”、“中”、“国”。

CJKAnalyzer

二分法分词:按两个字进行切分。如:“我是中国人”,效果:“我是”、“是中”、“中国”“国人”。

上边两个分词器无法满足需求。

SmartChineseAnalyzer

对中文支持较好,但扩展性差,扩展词库和禁用词库等不好处理

6.2.2.第三方中文分析器

paoding: 庖丁解牛最新版在 https://code.google.com/p/paoding/ 中最多支持Lucene 3.0,且最新提交的代码在 2008-06-03,在svn中最新也是2010年提交,已经过时,不予考虑。

IK-analyzer:最新版在https://code.google.com/p/ik-analyzer/上,支持Lucene 4.10从2006年12月推出1.0版开始, IKAnalyzer已经推出了4个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开 始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK实现了简单的分词 歧义排除算法,标志着IK分词器从单纯的词典分词向模拟语义分词衍化。 但是也就是2012年12月后没有在更新。

6.3.安装IK分词器

使用IK分词器可以实现对中文分词的效果。

下载IK分词器:(Github地址:GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary.

1、下载zip:

2、解压,并将解压的文件拷贝到ES安装目录的plugins下的ik(重命名)目录下,重启es  

 

3、测试分词效果:

POST /_analyze
{
  "text":"中华人民共和国人民大会堂",
  "analyzer":"ik_smart"
}

6.4.两种分词模式

ik分词器有两种分词模式:ik_max_word和ik_smart模式。

1、ik_max_word

会将文本做最细粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为“中华人民共和国、中华人民、中华、华人、人民大会堂、人民、共和国、大会堂、大会、会堂等词语。

2、ik_smart

会做最粗粒度的拆分,比如会将“中华人民共和国人民大会堂”拆分为中华人民共和国、人民大会堂。

6.5.自定义词库

如果要让分词器支持一些专有词语,可以自定义词库。

iK分词器自带的main.dic的文件为扩展词典,stopword.dic为停用词典。

也可以上边的目录中新建一个my.dic文件(注意文件格式为utf-8(不要选择utf-8 BOM)

可以在其中自定义词汇:

比如定义:

配置文件中 配置my.dic,

七.field详细介绍

上边章节安装了ik分词器,如何在索引和搜索时去使用ik分词器呢?如何指定field的类型?比如日期类型、数值类型等。

ES6.2核心的字段类型如下:

7.1.field的属性介绍

7.1.1.type:

通过type属性指定field的类型。

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa1111">"name"</span>:{    
       <span style="color:#000000">"type"</span>:<span style="color:#aa1111">"text"</span>
}</span></span>

7.1.2.analyzer:

通过analyzer属性指定分词模式。

<span style="background-color:#f8f8f8"><span style="color:#333333"> <span style="color:#aa1111">"name"</span>: {
                  <span style="color:#000000">"type"</span>: <span style="color:#aa1111">"text"</span>,
                  <span style="color:#000000">"analyzer"</span>:<span style="color:#aa1111">"ik_max_word"</span>
   }</span></span>

上边指定了analyzer是指在索引和搜索都使用ik_max_word,如果单独想定义搜索时使用的分词器则可以通过 search_analyzer属性。 对于ik分词器建议是索引时使用ik_max_word将搜索内容进行细粒度分词,搜索时使用ik_smart提高搜索精确性。

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa1111">"name"</span>: {
                  <span style="color:#000000">"type"</span>: <span style="color:#aa1111">"text"</span>,
                  <span style="color:#000000">"analyzer"</span>:<span style="color:#aa1111">"ik_max_word"</span>,<span style="color:red">#生成索引目录时</span>
                  <span style="color:#aa1111">"search_analyzer"</span>:<span style="color:#aa1111">"ik_smart"</span><span style="color:red">#检索时</span>
 }</span></span>

7.1.3.index:

通过index属性指定是否索引。 默认为index=true,即要进行索引,只有进行索引才可以从索引库搜索到。 但是也有一些内容不需要索引,比如:商品图片地址只被用来展示图片,不进行搜索图片,此时可以将index设置 为false。 删除索引,重新创建映射,将pic的index设置为false,尝试根据pic去搜索,结果搜索不到数据

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa1111">"pic"</span>: {
       <span style="color:#000000">"type"</span>:<span style="color:#aa1111">"text"</span>,           
       <span style="color:#000000">"index"</span>:<span style="color:#221199">false</span>
}</span></span>

7.1.4.source:

如果某个字段内容非常多,业务里面只需要能对该字段进行搜索,比如:商品描述。查看文档内容会再次到mysql或者hbase中取数据,把大字段的内容存在Elasticsearch中只会增大索引,这一点文档数量越大结果越明显,如果一条文档节省几KB,放大到亿万级的量结果也是非常可观的。

如果只想存储某几个字段的原始值到Elasticsearch,可以通过incudes参数来设置,在mapping中的设置如下:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">POST</span> <span style="color:#981a1a">/</span><span style="color:#000000">java01</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_mapping</span>
{
  <span style="color:#000000">"_source"</span>: {
    <span style="color:#000000">"includes"</span>:[<span style="color:#aa1111">"description"</span>]
  }
}</span></span>

同样,可以通过excludes参数排除某些字段:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">POST</span> <span style="color:#981a1a">/</span><span style="color:#000000">java01</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_mapping</span>
{
  <span style="color:#000000">"_source"</span>: {
    <span style="color:#000000">"excludes"</span>:[<span style="color:#aa1111">"description"</span>]
  }
}</span></span>

7.2.常用field类型

7.2.1.text文本字段

例如: 1、创建新映射:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">POST</span> <span style="color:#981a1a">/</span><span style="color:#000000">java01</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_mapping</span>
{
  <span style="color:#000000">"_source"</span>: {
    <span style="color:#000000">"includes"</span>:[<span style="color:#aa1111">"description"</span>]
  }  
  <span style="color:#aa1111">"properties"</span>: {   
       <span style="color:#aa1111">"name"</span>: {
           <span style="color:#aa1111">"type"</span>: <span style="color:#aa1111">"text"</span>,
           <span style="color:#aa1111">"analyzer"</span>:<span style="color:#aa1111">"ik_max_word"</span>,
           <span style="color:#aa1111">"search_analyzer"</span>:<span style="color:#aa1111">"ik_smart"</span>
       },         
      <span style="color:#aa1111">"description"</span>: {
          <span style="color:#000000">"type"</span>: <span style="color:#aa1111">"text"</span>,
          <span style="color:#000000">"analyzer"</span>:<span style="color:#aa1111">"ik_max_word"</span>,
          <span style="color:#000000">"search_analyzer"</span>:<span style="color:#aa1111">"ik_smart"</span>
      },
      <span style="color:#aa1111">"pic"</span>:{
          <span style="color:#000000">"type"</span>:<span style="color:#aa1111">"text"</span>,
          <span style="color:#000000">"index"</span>:<span style="color:#221199">false</span>
      }
  }   
}</span></span>

2、插入文档:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">POST</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#116644">1</span>
{
  <span style="color:#000000">"name"</span>:<span style="color:#aa1111">"python从入门到放弃"</span>,
  <span style="color:#000000">"description"</span>:<span style="color:#aa1111">"人生苦短,我用Python"</span>,
  <span style="color:#000000">"pic"</span>:<span style="color:#aa1111">"250.jpg"</span>
}</span></span>

3、查询测试:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">GET</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_search</span><span style="color:#981a1a">?</span><span style="color:#000000">q</span><span style="color:#981a1a">=</span><span style="color:#000000">name</span>:<span style="color:#000000">放弃</span>
<span style="color:#000000">GET</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_search</span><span style="color:#981a1a">?</span><span style="color:#000000">q</span><span style="color:#981a1a">=</span><span style="color:#000000">description</span>:<span style="color:#000000">人生</span>
<span style="color:#000000">GET</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_search</span><span style="color:#981a1a">?</span><span style="color:#000000">q</span><span style="color:#981a1a">=</span><span style="color:#000000">pic</span>:<span style="color:#116644">250.</span><span style="color:#000000">jpg</span></span></span>

结果:name和description都支持全文检索,pic不可作为查询条件

7.2.2.keyword关键字字段

上边介绍的text文本字段在映射时要设置分词器,keyword字段为关键字字段,通常搜索keyword是按照整体搜索,所以创建keyword字段往索引目录写时是不进行分词的,比如:邮政编码、手机号码、身份证等。keyword字段通常用于过虑、排序、聚合等。

例如: 1、更改映射:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">POST</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_mapping</span>
{
    <span style="color:#000000">"properties"</span>: {
       <span style="color:#000000">"studymodel"</span>:{
          <span style="color:#000000">"type"</span>:<span style="color:#aa1111">"keyword"</span>
       }
    }
}</span></span>

2、插入文档:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">PUT</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#116644">2</span>
{
 <span style="color:#000000">"name"</span>: <span style="color:#aa1111">"java编程基础"</span>,
 <span style="color:#000000">"description"</span>: <span style="color:#aa1111">"java语言是世界第一编程语言"</span>,
 <span style="color:#000000">"pic"</span>:<span style="color:#aa1111">"250.jpg"</span>,
 <span style="color:#000000">"studymodel"</span>: <span style="color:#aa1111">"2010年01月"</span>
}</span></span>

3、根据name查询文档:

<span style="background-color:#f8f8f8"><span style="color:#333333">GET /java06/course/_search?q=studymodel:2010年01月</span></span>

name是keyword类型,所以查询方式是精确查询。

7.2.3.date日期类型

日期类型不用设置分词器,通常日期类型的字段用于排序。 1)format 通过format设置日期格式,多个格式使用双竖线||分隔, 每个格式都会被依次尝试, 直到找到匹配的

例如: 1、设置允许date字段存储年月日时分秒、年月日及毫秒三种格式。

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">POST</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_mapping</span>
{
    <span style="color:#000000">"properties"</span>: {
       <span style="color:#000000">"timestamp"</span>: {
         <span style="color:#000000">"type"</span>:   <span style="color:#aa1111">"date"</span>,
         <span style="color:#000000">"format"</span>: <span style="color:#aa1111">"yyyy-MM-dd"</span>
       }
     }
}</span></span>

2、插入文档:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">PUT</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#116644">3</span>
{
<span style="color:#000000">"name"</span>: <span style="color:#aa1111">"spring开发基础"</span>,
<span style="color:#000000">"description"</span>: <span style="color:#aa1111">"spring 在java领域非常流行,java程序员都在用。"</span>,
<span style="color:#000000">"studymodel"</span>: <span style="color:#aa1111">"201001"</span>,
 <span style="color:#000000">"pic"</span>:<span style="color:#aa1111">"250.jpg"</span>,
 <span style="color:#000000">"timestamp"</span>:<span style="color:#aa1111">"2018-07-04 18:28:58"</span>
}</span></span>

7.2.4.Numeric类型

es中的数字类型经过分词(特殊)后支持排序和区间搜索

例如: 1、更新已有映射:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">POST</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#000000">_mapping</span>
{
    <span style="color:#000000">"properties"</span>: {
    <span style="color:#000000">"price"</span>: {
        <span style="color:#000000">"type"</span>: <span style="color:#aa1111">"float"</span>
     }
  }
} </span></span>

2、插入文档

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">PUT</span> <span style="color:#981a1a">/</span><span style="color:#000000">java06</span><span style="color:#981a1a">/</span><span style="color:#000000">course</span><span style="color:#981a1a">/</span><span style="color:#116644">3</span>
{
 <span style="color:#000000">"name"</span>: <span style="color:#aa1111">"spring开发基础"</span>,
 <span style="color:#000000">"description"</span>: <span style="color:#aa1111">"spring 在java领域非常流行,java程序员都在用。"</span>,
 <span style="color:#000000">"studymodel"</span>: <span style="color:#aa1111">"201001"</span>,
 <span style="color:#000000">"pic"</span>:<span style="color:#aa1111">"250.jpg"</span>,
 <span style="color:#000000">"price"</span>:<span style="color:#116644">38.6</span>
}</span></span>

7.3.field属性的设置标准

属性标准
type是否有意义
index是否搜索
source是否展示

7.4 field主要知识总结

 1、field数据类型
        文本:text、keyword(往索引目录写不进行分词)
        数字:integer、long、float、double
  2、field的属性
         type:数据类型,如:text、long
         analyzer:往索引目录写或搜索时的分词模式,如:analyzer=ik_max_word,analyzer=ik_smart
         index:是否往索引目录写,如:true、false
         _source:document中是否存储,如:includes,excludes
    3、field属性的设置标注
          属性                     标准
          type                   分词是否有意义
          index                  是否搜索
          _source                是否展示

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值