Lucene 是一套信息检索工具包,包含索引结构、读写索引的工具、排序和搜索工具类
ElasticSearch 基于 Lucene,做了一些封装和增强
ES是分布式全文搜索引擎,目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性
ElasticSearch的安装
官网下载,解压即用:https://www.elastic.co/
如果电脑内存有限,建议修改堆内存初始化值和最大值为512m,默认为1g
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
-Xms512m
-Xmx512m
ES配置文件:
配置允许跨域访问:
http.cors.enabled: true
http.cors.allow-origin: "*"
启动ES
访问9200端口:
{
"name" : "BLU",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "NNESyFEsSH2kvElzRN6t_A",
"version" : {
"number" : "7.7.1",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "ad56dce891c901a492bb1ee393f12dfff473a423",
"build_date" : "2020-05-28T16:30:01.040088Z",
"build_snapshot" : false,
"lucene_version" : "8.5.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
安装可视化界面 es head(依赖nodejs)
下载地址:https://github.com/mobz/elasticsearch-head
启动:
cnpm install
npm run start
访问默认端口9100:
如果之前ES的允许跨域没有配置,则elasticsearch会显示未连接:
安装Kibana
官网下载:https://www.elastic.co/cn/downloads/kibana
解压并启动,访问默认端口5601:
Kibana汉化配置:
i18n.locale: "zh-CN"
ElasticSearch与关系型数据库的对比:
Relational DB | ElasticSearch |
---|---|
数据库 Database | 索引 indices |
表 Table | types |
行 row | documents |
字段 column | fields |
一个集群至少有一个节点,一个节点就是一个elasticsearch进程,节点可以包含多个索引,每个索引默认分为五个主分片,每个主分片有一个副本,它们分布在不同节点上,以防止某个节点挂掉导致数据丢失。
![]() | 默认分片数为5,默认副本数为1 |
---|---|
![]() | 索引分为5个分片,每个分片1个副本,分布在不同节点中 |
实际上,一个分片就是一个 Lucene索引,一个包含 倒排索引 的文件目录,倒排索引结构使ES在不扫描全部文档的情况下就可知道哪些文档中包含特定的关键字。 |
倒排索引示例
现有两个文档:
文档1:Study every day, good good up to forever
文档2:To forever, study every day, good good up
词条统计:
term | doc1 | doc2 |
---|---|---|
Study | Y | X |
To | X | X |
every | Y | Y |
forever | Y | Y |
day | Y | Y |
study | X | Y |
good | Y | Y |
every | Y | Y |
to | Y | X |
up | Y | Y |
尝试搜索:to forever
term | doc1 | doc2 |
---|---|---|
to | Y | X |
forever | Y | Y |
文档1的匹配度更高 |
IK分词器插件(中文分词器)
注:IK版本必须和ES版本对应!
在es的plugin目录下新建文件夹 ik,将包解压至ik文件夹内即可
IK提供了两种算法:ik_smart 最少切分 和 ik_max_word 最细粒度划分
使用Kibana测试IK分词器:
ik_smart 最少切分:
GET _analyze
{
"analyzer": "ik_smart",
"text": "中国内地男歌手许嵩"
}
ik_max_word 最细粒度划分:
GET _analyze
{
"analyzer": "ik_max_word",
"text": "中国内地男歌手许嵩"
}
问题:"许嵩"被拆开为了许和嵩两个词
给IK分词器添加自定义词:
- 在 ik 目录下的 config 文件夹中创建 vae.dic 字典文件
许嵩
- 在 IKAnalyzer.cfg.xml 配置文件中设置引用自定义的字典文件
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">vae.dic</entry>