浅入Elasticsearch(全文检索服务器)

目录

系列文章目录

一、首先是我们为什么要用Elasticsearch

二、Elasticsearch的介绍

三、Elasticsearch的原理

四、ES客户端

五、Es客户端的安装

5.1 安装

5.1.1 设置虚拟机内存

5.1.2 创建用户

5.1.3 解压安装包(ES是Java开发的应用,解压即安装: )

5.1.4 配置文件

elasticsearch.yml

jvm.options

5.2 启动与关闭ES

测试

 5.3 安装Kibana

        5.3.1神马是kibana呢?

        5.3.2 下载

        5.3.4 启动

​编辑

         5.3.5 测试

5.4 安装head

        5.4.1 安装

        5.4.2 测试

六、ES快速入门

6.1index管理

6.1.1 创建index

 6.1.2修改index

6.1.3.删除index(可以批量删除)

6.2mapping 管理

6.2.1 创建mapping

6.2.2.查询mapping

6.2.3.更新mapping

6.2.4 添加mapping

6.2.4.删除mapping

6.3.document管理

6.3.1.创建document

6.3.1.1.POST语法

6.3.1.2.PUT语法

6.3.2.查询document

5.3.3.删除Document

6.4.ES读写过程

6.4.1.documnet routing(数据路由)

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

七、Ik分词器

 1、安装

​编辑    2、自定义词库

        注意:必须另存为UTF-8    3、分词模式

7.1.luke查看ES的逻辑结构

总结:



系列文章目录

Elasticsearch的简单介绍以及使用


一、首先是我们为什么要用Elasticsearch

        像我们访问网站时候,可以根据我们随意所想的内容输入就可以查询出相关的内容,这些随意的内容是不可能在数据库查出来的,那么为什么这些千奇百怪的 内容都可以查出来呢?

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

二、Elasticsearch的介绍

        Elasticsearch是一个基于Lucene搜索服务器。他提供了基于RESTful web接口分布式全文搜索引擎

        ElasticSearch用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。根据DB-Engines的排名显示,ElasticSearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基Lucene)。

总结:

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

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

那么es(es就是Elasticsearch的简称)和 solr应该选那个呢?      

        1.如果你公司现在用的solr可以满足需求就不要换了。

        2.如果你公司准备进行全文检索项目的开发,建议优先考虑elasticsearch,因为像Github这样大规模的搜索都在用它。

三、Elasticsearch的原理

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

        倒排索引:就是查字典通过目录找(通过关键字找文档):

                倒排索引表的组成:

                 term(关键字)
                 trem----------【关联】------------>document(文档)
                 document(文档)

浅入Elasticsearch(全文检索服务器)_第1张图片

         分词列表的特点:

                1、关键字不重复

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

                3、不搜索的filed(域)不参加分词,eg:图片地址

四、ES客户端

        1、TransportClient:8.0后会删除
        2、 RestHighLevelVClient:官方推荐

使用ES客户端所需要的依赖


    org.elasticsearch.client
    elasticsearch-rest-high-level-client

五、Es客户端的安装

5.1 安装

        ElasticSearch官网:https://www.elastic.co/cn/

5.1.1 设置虚拟机内存

浅入Elasticsearch(全文检索服务器)_第2张图片

5.1.2 创建用户

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

1).创建elk 用户组

[root@localhost ~]# groupadd elk

2).创建用户admin

[root@localhost ~]# useradd admin

[root@localhost ~]# passwd admin

3).将admin用户添加到elk组

[root@localhost ~]# usermod -G elk admin

4)为用户分配权限

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

[root@localhost ~]# chown -R admin:elk /usr/upload

[root@localhost ~]# chown -R admin:elk /usr/local

5)切换用户:

[root@localhost ~]#  su admin

5.1.3 解压安装包(ES是Java开发的应用,解压即安装: )

[admin@localhost ~]# tar -zxvf elasticsearch-6.2.3.tar.gz -C /usr/local

目录结构:

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

5.1.4 配置文件

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

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

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

log4j2.properties:用于配置Elasticsearch日志

elasticsearch.yml

cluster.name: power_shop  #配置elasticsearch的集群名称,默认是elasticsearch。建议修改成一个有意义的名称。

node.name: power_shop_node_1 #节点名,通常一台物理服务器就是一个节点 ,建议指定一个有意义的名称

network.host: 0.0.0.0 # 设置绑定主机的ip地址,设置为0.0.0.0表示绑定任何ip,允许外网访问,生产环境建议设置为具体的ip。


http.port: 9200 #设置对外服务的http端口,默认为9200。


transport.tcp.port: 9300 # 集群结点之间通信端口


discovery.zen.ping.unicast.hosts: ["192.168.184.135:9300", "192.168.184.136:9300"]  #设置集群中master节点的初始列表。


path.data: /usr/local/elasticsearch-6.2.3/data #设置索引数据的存储路径,默认是es_home下的data文件夹,可以设置多个存储路径,用逗号隔开


path.logs: /usr/local/elasticsearch-6.2.3/logs #设置日志文件的存储路径,默认是es_home下的logs文件夹

http.cors.enabled: true #是否支持跨域,默认为false

http.cors.allow-origin: /.*/  #当设置允许跨域,默认为*,表示支持所有域名

jvm.options

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

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

1) 两个值设置为相等

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

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

-Xms512m
-Xmx512m

5.2 启动与关闭ES

1、启动

./elasticsearch
#或
./elasticsearch -d   

2.关闭

ps-ef|grep elasticsearch

kill -9 pid

到了这里肯定有小伙伴试着去启动了,是不是启动不了呢?没错肯定启动不了

解决启动问题:

问题一:解决内核问题

浅入Elasticsearch(全文检索服务器)_第3张图片

我们使用的是centos6,其linux内核版本为2.6。而Elasticsearch的插件要求至少3.5以上版本。不过没关系,我们禁用这个插件即可。 (有的小伙伴用的版本高,不过都是一样的操作)

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

        bootstrap.system_call_filter: false

问题二:解决文件创建权限问题

报错信息:

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

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

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

su root #切换到root

vim /etc/security/limits.conf

追加下面的内容:

* soft nofile 65536
* hard nofile 65536

问题三:解决线程开启限制问题

报错信息:

[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

问题三:解决虚拟内存问题

报错信息:

[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 #限制一个进程可以拥有的VMA(虚拟内存区域)的数量
然后执行命令,让sysctl.conf配置生效:
sysctl -p

到了这里肯就可以启动了,测试一下

测试

浏览器访问:http://192.168.204.132:9200 (这个地址写自己虚拟机设置的ip)

浅入Elasticsearch(全文检索服务器)_第4张图片

 5.3 安装Kibana

        5.3.1神马是kibana呢?

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

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

        5.3.2 下载

                        ElasticSearch官网:https://www.elastic.co/cn/

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

       5.3.3 修改配置:修改config/kibana.yml配置:

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

        5.3.4 启动

浅入Elasticsearch(全文检索服务器)_第5张图片

         5.3.5 测试

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

浅入Elasticsearch(全文检索服务器)_第6张图片

5.4 安装head

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

        5.4.1 安装

        1)下载head

        下载地址:https://github.com/mobz/elasticsearch-head

        2)运行 (cmd窗口)

npm run start

        5.4.2 测试

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

浅入Elasticsearch(全文检索服务器)_第7张图片

六、ES快速入门

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

6.1index管理

6.1.1 创建index

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

语法:PUT /index_name(索引库名)

PUT /zz2202
{
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 1
  }
}

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

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

效果:

浅入Elasticsearch(全文检索服务器)_第8张图片

 6.1.2修改index

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

语法:PUT /index_name/_settings

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

注意:index一旦创建,主分片数量不可修改,因为:Get时--->hash(id)%number_of_shards

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

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

6.1.3.删除index(可以批量删除)

DELETE /zz2202[, other_index]

6.2mapping 管理

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

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

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

6.2.1 创建mapping

语法:

POST /index_name/type_name/_mapping

      |     |      |

    索引库   类型(表)  域(字段)

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

效果:

浅入Elasticsearch(全文检索服务器)_第9张图片

6.2.2.查询mapping

查询所有索引的映射:

GET /java06/course/_mapping

6.2.3.更新mapping

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

6.2.4 添加mapping

POST /zz2202/user/_mapping
{
  "properties": {
    "address": {
      "type": "text"
    }
  }

6.2.4.删除mapping

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

6.3.document管理

6.3.1.创建document

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

6.3.1.1.POST语法

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

语法:POST /index_name/type_name/id

如:

POST /zz2202/user/3
{
  "name": "玉皇大帝 ",
  "age": 500,
  "sex": "男 "
}

6.3.1.2.PUT语法

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

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

如:

PUT /zz2202/user/3
{
  "name": "王母娘娘  ",
  "age": 500,
  "sex": "女 "
}

结果: 、

{
  "_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查询数据:

浅入Elasticsearch(全文检索服务器)_第10张图片

6.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": "zz2202", # 索引名称
        "_type": "user",  # 类型名称
        "_id": "3",  # id 值
        "_score": 1,   # 匹配度分数,本条数据匹配度分数
        "_source": {  # 具体的数据内容
          "name": "王母娘娘  ",
          "age": 500,
          "sex": "女 "
        }
      },
      {
        "_index": "zz2202",
        "_type": "user",
        "_id": "1",
        "_score": 1,
        "_source": {
          "name": "小垃圾",
          "age": "20",
          "sex": "男"
        }
      },
      {
        "_index": "zz2202",
        "_type": "user",
        "_id": "2",
        "_score": 1,
        "_source": {
          "name": "aahja ",
          "age": 10,
          "sex": "女"
        }
      }
    ]
  }
}

5.3.3.删除Document

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

语法:

DELETE /index_name/type_name/id

如:

DELETE /java06/course/3

结果:

{
  "_index": "zz2202",
  "_type": "user",
  "_id": "2",
  "_version": 11,
  "result": "deleted",
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 13,
  "_primary_term": 5
}

6.4.ES读写过程

6.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主分片数量。

6.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个primary shard,你加了一个document 它的id是5,然后会把这个id通过一个hash算法,计算出一个值,然后再和primary shard的数量求余,最终会将加入的document存入计算出来的primary shard里,往出取得时候也是同理,如果加了一个primary shard 那么通过这个算法将取不到值。

七、Ik分词器

 1、安装

       下载IK分词器:(Github地址:https://github.com/medcl/elasticsearch-analysis-ik)

        注意:IK分词器插件的版本要和ElasticSearch的版本一致

        解压到plug目录下,并重命名为ik

浅入Elasticsearch(全文检索服务器)_第11张图片
    2、自定义词库

        IKAnalyzer.cfg.xml:配置扩展词典和停用词典
        main.dic:扩展词典,eg:奥利给
        stopword.dic:停用词典,eg:a、an、the、的、地、得

 浅入Elasticsearch(全文检索服务器)_第12张图片

        注意:必须另存为UTF-8
    3、分词模式

        ik_smart:粗粒度,搜索时使用
        ik_max_word:细粒度,往索引目录写时使用

7.1.luke查看ES的逻辑结构

  1. 拷贝elasticsearch-6.2.3/data到windows

  2. 双击luke.bat,启动luke

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

浅入Elasticsearch(全文检索服务器)_第13张图片

测试分词效果:

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

结果:

浅入Elasticsearch(全文检索服务器)_第14张图片

总结:

        本章内容就先到这里,看到这里的小伙伴肯定也有自己的理解,博主就不在这里总结了,下一篇文章继续搞起来!!

你可能感兴趣的:(java,elasticsearch,全文检索,搜索引擎)