全文检索服务器-Elasticsearch

目录

1.ElasticSearch 介绍

1.1.为什么要用ElasticSearch?

1.2.ElasticSearch介绍

1.3.原理与应用

1.3.1.索引结构

1.3.2.倒排索引

2.安装 ElasticSearch

2.1.环境需求

2.2.Linux安装ES

2.2.1.下载

2.2.2.设置虚拟机内存

2.2.3.创建用户

2.2.4.安装

2.2.5.ES目录结构

2.3.配置文件

2.3.1.elasticsearch.yml

2.3.2. jvm.options

2.3.3.log4j2.properties

2.4.启动ES

2.4.1.启动和关闭

2.4.2.解决文件创建权限问题

2.4.3.解决线程开启限制问题

2.4.4.解决虚拟内存问题

2.5.测试

3.安装Kibana

3.1.什么是Kibana

3.1.下载

3.2.安装

3.3.修改配置

3.4.启动

3.5.测试

4.安装head

4.1.什么是head

4.2.安装

4.3.测试

5.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的逻辑结构

6.IK分词器

6.1.测试分词器

6.2.中文分词器

6.2.1.Lucene自带中文分词器

6.2.2.第三方中文分析器

6.3.安装IK分词器

6.4.两种分词模式

6.5.自定义词库


1.ElasticSearch 介绍

1.1.为什么要用ElasticSearch?

        当我们访问购物网站的时候,我们可以根据我们随意所想的内容输入关键字就可以查询出相关的内容,这是怎么做到呢?这些随意的数据不可能是根据数据库的字段查询的,那是怎么查询出来的呢,为什么千奇百怪的关键字都可以查询出来呢? ​

        答案就是全文检索服务,ElasticSearch是一个基于Lucene的全文检索服务器,而lucene采用了词元匹配方案。举个例子:北京天安门----Lucene切分词:北京  天安门  等等这些词元,当我们搜索的时候这些词元都可以检索到北京天安门。

1.2.ElasticSearch介绍

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个基于RESTful web接口的分布式全文搜索引擎。ElasticSearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。根据DB-Engines的排名显示,ElasticSearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。

总结:

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

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

1.3.原理与应用

1.3.1.索引结构

下图是ElasticSearch的索引结构,右边黑蓝色色部分是原始文档,左边黄色部分是逻辑结构,逻辑结构也是为了更好的去描述ElasticSearch的工作原理及去使用物理结构中的索引文件。

全文检索服务器-Elasticsearch_第1张图片

1.3.2.倒排索引

倒排索引(Inverted index):也常被称为反向索引,倒排索引是从关键字到文档的映射(已知关键字求文档)。类似查字典时从目录找(关键字---->文档)

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

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

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

        分词列表的特点:1.不重复    

                                     2.“的 地 得 a an the”语气词不参加分词    

                                     3.不搜索的filed不参加分词,eg:图片地址

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

如下:

全文检索服务器-Elasticsearch_第2张图片

如果我们想搜索 包含quick brown词条的文档:

全文检索服务器-Elasticsearch_第3张图片

两个文档都匹配,但是第一个文档比第二个匹配度更高。如果我们使用仅计算匹配词条数量的简单 相似性算法 ,那么,我们可以说,对于我们查询的相关性来讲,第一个文档比第二个文档更佳。

2.安装 ElasticSearch

2.1.环境需求

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

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

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

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

2.2.Linux安装ES

2.2.1.下载

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

2.2.2.设置虚拟机内存

全文检索服务器-Elasticsearch_第4张图片

2.2.3.创建用户

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

1.创建elk 用户组

groupadd elk

2.创建用户admin

useradd admin
passwd admin

3.将admin用户添加到elk组

usermod -G elk admin

5.为用户分配权限

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

切换用户:

su admin

2.2.4.安装

ES是Java开发的应用,解压即安装:

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

2.2.5.ES目录结构

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

2.3.配置文件

ES安装目录config中配置文件如下:

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

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

log4j2.properties:用于配置Elasticsearch日志

2.3.1.elasticsearch.yml

cluster.name: 自定义
node.name: 自定义
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
discovery.zen.ping.unicast.hosts: ["192.168.5.135:9300", "192.168.5.136:9300"]
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: /.*/

常用的配置项如下:

cluster.name:
       配置elasticsearch的集群名称,默认是elasticsearch。建议修改成一个有意义的名称。   
node.name:
      节点名,通常一台物理服务器就是一个节点,es会默认随机指定一个名字,建议指定一
个有意义的名称,方便管理一个或多个节点组成一个cluster集群,集群是一个逻辑的概念,
节点是物理概念.
path.data: 
       设置索引数据的存储路径,默认是es_home下的data文件夹,可以设置多个存储路径,用逗号隔开。      
path.logs:
       设置日志文件的存储路径,默认是es_home下的logs文件夹         
network.host:  
       设置绑定主机的ip地址,设置为0.0.0.0表示绑定任何ip,允许外网访问,生产环境建议设置为具体的ip。   
http.port: 9200
       设置对外服务的http端口,默认为9200。      
transport.tcp.port: 9300 
       集群结点之间通信端口      
discovery.zen.ping.unicast.hosts:[“host1:port”, “host2:port”, “…”]  
       设置集群中master节点的初始列表。
discovery.zen.ping.timeout: 3s  
       设置ES自动发现节点连接超时的时间,默认为3秒,如果网络延迟高可设置大些。
http.cors.enabled:
       是否支持跨域,默认为false
http.cors.allow-origin:
       当设置允许跨域,默认为*,表示支持所有域名

2.3.2. jvm.options

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

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

1) 两个值设置为相等

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

默认内存占用太多了,可以调小一些:

-Xms512m
-Xmx512m

2.3.3.log4j2.properties

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

2.4.启动ES

2.4.1.启动和关闭

1、启动

./elasticsearch
#或
./elasticsearch -d    

2、关闭

ps-ef|grep elasticsearch

kill -9 pid

2.4.2.解决文件创建权限问题

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

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

vim /etc/security/limits.conf

追加下面的内容:

* soft nofile 65536
* hard nofile 65536

2.4.3.解决线程开启限制问题

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

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

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

使用root用户修改配置:

vim /etc/security/limits.conf

追加:

* soft nproc 4096
* hard nproc 4096

2.4.4.解决虚拟内存问题

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

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

vim /etc/sysctl.conf

追加下面内容:

vm.max_map_count=655360 #限制一个进程可以拥有的VMA(虚拟内存区域)的数量

然后执行命令,让sysctl.conf配置生效:

sysctl -p

2.5.测试

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

浏览器访问:http://192.168.5.135:9200

返回结果如下:

{
  "name" : "自定义", # node name 结点名称。随机分配的结点名称
  "cluster_name" : "自定义", # 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"
}

3.安装Kibana

3.1.什么是Kibana

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

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

3.1.下载

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

3.2.安装

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

3.3.修改配置

修改config/kibana.yml配置:

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

3.4.启动

./bin/kibana

3.5.测试

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

全文检索服务器-Elasticsearch_第5张图片

4.安装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、运行

cmd窗口运行npm run start

E:\MyJavaTools\Elasticsearch\elasticsearch-head-master>npm run start

> [email protected] start
> grunt server

>> Local Npm module "grunt-contrib-jasmine" not found. Is it installed?

Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100

4.3.测试

浏览器访问: 127.0.0.1:9100

全文检索服务器-Elasticsearch_第6张图片

 连接ElasticSearch

全文检索服务器-Elasticsearch_第7张图片

5.ES快速入门

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

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

创建数据库-->建表-->设置表中字段              增删改查数据row(记录)

创建index(索引库)-->建type-->设置type中的field(域)            增删改查document(文档)

5.1.index管理

5.1.1.创建index

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

语法:PUT /index_name

如:

PUT /java2022
{
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 0
  }
}

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

number_of_replicas - 是为每个 primary shard分配的replica shard数,提高了ES的可用性,注意:一台服务器时,备份分片的数量必须设置为0,因为主备在同一台上没有意义

全文检索服务器-Elasticsearch_第8张图片

 效果:

全文检索服务器-Elasticsearch_第9张图片

5.1.2.修改index

注意:索引一旦创建,主分片(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。

语法:PUT /index_name/_settings

如:

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

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

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

5.1.3.删除index

DELETE /java2022[, other_index]

5.2.mapping管理

5.2.1 创建mapping

映射,创建映射就是向索引库中创建field(类型、是否索引、是否存储等特性)的过程 。相当于创建数据库表table中的字段column。

语法:POST /index_name/type_name/_mapping

如:

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

效果:

全文检索服务器-Elasticsearch_第10张图片

5.2.2.查询mapping

查询所有索引的映射:

GET /java2022/course/_mapping

5.2.3.更新mapping

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

5.2.4.删除mapping

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

5.3.document管理

5.3.1.创建document

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

5.3.1.1.POST语法

此新增 Document 方式,id可写可不写,不写则自动生成 id ,一般新增使用POST

语法:POST /index_name/type_name/id

如:

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

全文检索服务器-Elasticsearch_第11张图片

   全文检索服务器-Elasticsearch_第12张图片

{
  "_index": "java2022", 新增的 document 在什么 index 中,
  "_type": "course", 新增的 document 在 index 中的哪一个 type 中。
  "_id": "yrI_34IB8UOMWNcay8Xx", 指定的 id 是多少,POST不指定自动生成一个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
}

5.3.1.2.PUT语法

此Document 新增方式必须指定id ,id存在则修改,一般修改使用PUT

语法:PUT/index_name/type_name/id

如:

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

通过head查询数据:

全文检索服务器-Elasticsearch_第13张图片

5.3.2.查询document

语法:

GET /index_name/type_name/id

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

如:根据type和id查询文档

GET /java2022/course/1

全文检索服务器-Elasticsearch_第14张图片

 如:查询所有记录

GET /java2022/course/_search

全文检索服务器-Elasticsearch_第15张图片

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

GET /java2022/course/_search?q=name:python

结果:

{
  "took": 57, # 执行的时长。单位毫秒
  "timed_out": false, # 是否超时
  "_shards": { # shard 相关数据
    "total": 2, # 总计多少个 shard
    "successful": 2, # 成功返回结果的 shard 数量
    "skipped": 0,
    "failed": 0
  },
  "hits": { # 搜索结果相关数据
    "total": 1, # 总计多少数据,符合搜索条件的数据数量
    "max_score": 0.6931472, # 最大相关度分数,和搜索条件的匹配度
    "hits": [ # 具体的搜索结果
      {
        "_index": "java2022", # 索引名称
        "_type": "course", # 类型名称
        "_id": "1", # id 值
        "_score": 0.6931472, # 匹配度分数,本条数据匹配度分数
        "_source": { # 具体的数据内容
          "name": "python从入门到放弃",
          "description": "人生苦短,我用Python",
          "studymodel": "201001"
        }
      }
    ]
  }
}

5.3.3.删除Document

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

语法:DELETE /index_name/type_name/id

如:

DELETE /java2022/course/yrI_34IB8UOMWNcay8Xx

结果:

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

5.4.ES读写过程

5.4.1.documnet routing(数据路由)

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

路由过程:

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

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

    number_of_primary_shards主分片数量。

5.4.4.为什么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、下载解压luke

2、拷贝elasticsearch-6.2.3/data到windows

3、双击luke.bat,启动luke,选择拷贝的data文件

全文检索服务器-Elasticsearch_第16张图片

4、使用luke查看

全文检索服务器-Elasticsearch_第17张图片

6.IK分词器

6.1.测试分词器

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

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

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

结果如下:

 全文检索服务器-Elasticsearch_第18张图片

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

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:

全文检索服务器-Elasticsearch_第19张图片

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

3、测试分词效果:

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

 全文检索服务器-Elasticsearch_第20张图片

6.4.两种分词模式

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

1、ik_max_word

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

2、ik_smart

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

6.5.自定义词库

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

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

全文检索服务器-Elasticsearch_第21张图片

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

可以在其中自定义词汇:

比如定义:

全文检索服务器-Elasticsearch_第22张图片

 配置文件中 配置my.dic

全文检索服务器-Elasticsearch_第23张图片

测试:

POST /_analyze
{
  "text":"他夺笋啊,我破防了,emo了,哇!蚌埠住了,我要找麻麻!嘤嘤嘤",
  "analyzer":"ik_smart"
}

效果:

全文检索服务器-Elasticsearch_第24张图片

7.field详细介绍

7.1.field的属性介绍

7.1.1.type:

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

"name":{	
       "type":"text"
}

7.1.2.analyzer:

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

 "name": {
       "type": "text",
       "analyzer":"ik_max_word"
}

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

"name": {
    "type": "text",
    "analyzer":"ik_max_word",#生成索引目录时
    "search_analyzer":"ik_smart"#检索时
 }

7.1.3.index:

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

"pic": {
  	   "type":"text",           
       "index":false
}

7.1.4.source:

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

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

POST /java2022/course/_mapping
{
  "_source": {
    "includes":["description"]
  }
}

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

POST /java2022/course/_mapping
{
  "_source": {
    "excludes":["description"]
  }
}

7.2.常用field类型

7.2.1.text文本字段

例如: 1、创建新映射:

POST /java2022/course/_mapping
{
  "_source": {
    "includes":["description"]
  }  
  "properties": {   
       "name": {
           "type": "text",
           "analyzer":"ik_max_word",
           "search_analyzer":"ik_smart"
       },         
      "description": {
          "type": "text",
          "analyzer":"ik_max_word",
          "search_analyzer":"ik_smart"
      },
      "pic":{
          "type":"text",
          "index":false
      }
  }   
}

2、插入文档:

POST /java2022/course/1
{
  "name":"python从入门到放弃",
  "description":"人生苦短,我用Python",
  "pic":"250.jpg"
}

3、查询测试:

GET /java2022/course/_search?q=name:放弃
GET /java2022/course/_search?q=description:人生
GET /java2022/course/_search?q=pic:250.jpg

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

7.2.2.keyword关键字字段

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

例如: 1、更改映射:

POST /java2022/course/_mapping
{
 	"properties": {
       "studymodel":{
          "type":"keyword"
       }
 	}
}

2、插入文档:

PUT /java2022/course/2
{
 "name": "java编程基础",
 "description": "java语言是世界第一编程语言",
 "pic":"250.jpg",
 "studymodel": "2010年01月"
}

3、根据name查询文档:

GET /java2022/course/_search?q=studymodel:2010年01月

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

7.2.3.date日期类型

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

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

POST /java2022/course/_mapping
{
	"properties": {
       "timestamp": {
         "type":   "date",
         "format": "yyyy-MM-dd"
       }
     }
}

2、插入文档:

PUT /java2022/course/3
{
    "name": "spring开发基础",
    "description": "spring 在java领域非常流行,java程序员都在用。",
    "studymodel": "201001",
    "pic":"250.jpg",
    "timestamp":"2018-07-04 18:28:58"
}

7.2.4.Numeric类型

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

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

POST /java2022/course/_mapping
{
	"properties": {
	"price": {
        "type": "float"
     }
  }
} 

2、插入文档

PUT /java2022/course/3
{
 "name": "spring开发基础",
 "description": "spring 在java领域非常流行,java程序员都在用。",
 "studymodel": "201001",
 "pic":"250.jpg",
 "price":38.6
}

7.3.field属性的设置标准

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

你可能感兴趣的:(笔记,elasticsearch,elasticsearch,全文检索,服务器)