ElasticSearch 英 [ɪ'læstɪk]
adj. 灵活的;有弹性的;可变的
n. 橡皮圈;有松紧的东西
全文数据的检索 这个简称 ES
两种检索方式:
顺序扫描法 慢
索引扫描法
全文检索的基本思路,即将非结构化数据中的一部分信息提取出来,重新组织,使变得有一定的结构,然后对此有一定结构的数据进行检索,从而达到搜索相对较快的目的。
全文检索的过程
1、索引的创建
2、索引的搜索
索引保存了什么? 也就是文档的ID

例如 hadoop 保存了 35 77 100 那么这三个数字就是 文档的ID 这些都是 倒序表
索引只会创建一次 ,比顺序扫描法 快的多
创建索引的步骤:
1、找到要提取关键字的文章
2、将文章传递给分词组件 Tokenizer
将文档分成一个一个的单词、去除标点符号 、去除停词
3、交给语言处理组件 LinuisticProcessor
4、将得到的词(Term)传给索引组件 (Indexer)
利用得到的词Term创建一个字典
对字典按字母顺序进行排序
合并相同过的词(Term)成为文档倒排(Posting List)链表

以上是索引创建的步骤。
那么看看搜索索引是怎么工作的:
第一步:用户输入查询搜索语句
第二步:对查询语句进行词法分析,语法分析及语言处理
第三步:搜索索引,得到符合文档
全文检索引擎是目前广泛应用主流搜索引擎。
全文检索的主要开源的产品
lucene sphinx xapian nutch Elasticsearch
Elasticsearch是一个基于apache Lucene开源搜索引擎,无论在开源还是专有领域,lucene可以被认为是迄今为止最先进、性能最好功能最全的搜索引擎库。
ES 对lucene 进行了包装。
Es 是使用java开发并使用 Lucene作为核心实现所有引擎和所搜的
优势:
所有功能集成在一个服务里,可以通过 RESTful API 、各种语言的客户端甚至命令行与之交互,
免费下载、使用和修改
配置灵活
安装:
官网:
http://www.elastic.co
好的,看看ES的安装:
http://www.elastic.co/cn/downloads/elasticsearch
elasticsearch 的安装是有版本内核要求的,因此并不是随便安装最新等等
我们通过上面下载
yum install -y elasticsearch-2.4.1.rpm 这样的命令进行安装
配置:
然后进行简单的配置
vim /etc/elasticsearch/elasticsearch.yml 进行配置
cluster.name:yii2-search
node.name:master-1
具体其他配置可以访问官网:
path.data:/path/to/data 数据的存储路径
path.logs:/path/to/logs 日志存储路径
network
network.host:192.168.199.112
http.port:9200
保存退出
启动:
怎么启动:
service elasticsearch start
然后就可以通过浏览器进行访问了,这是返回 json 的一个数据。
安装插件:
下面我们安装一些插件:
ik 支持中文分词 elasticsearch-analysis-ik
通过github 进行clone 克隆下来
有版本,对应elastic
git clone https://asdfasdfasdfasdfadsf
然后进入lk 目录
git checkout tags/v1.10.1
然后通过 mvn package 进行安装
安装好以后,在当前目录 target/releases/下面 出现 elasticsearch-analysis-ik-1.10.1.zip 的包
如果你的elasticsearch是通过yum安装的,那么就把这个分词包放在
cp elasticsearch-analysis-ik-1.10.1.zip /usr/share/elasticsearch/plugins/ 下面
进入 /usr/share/elasticsearch/plugins/ 解压 elasticsearch-analysis-ik-1.10.1.zip
unzip elasticsearch-analysis-ik-1.10.1.zip
mkdir ik
mv ./* ik
也可以将 elasticsearch-analysis-ik-1.10.1.zip 解压到的ik下
上面的解压完毕后 从新启动一下,就加载 ik组件了。
分词工具:
analyze分词器 standard 和ik的区别
standard 标准分词
ik 中文分词
那么在 命令终端中 使用 curl 'http://192.168.199.112:9200' 是可以返回到 一个json数据的,
证明 elasticsearch是正常运行的。
我们去分析一下 分词组件
curl -XPOST "http://192.168.199.112:9200/_analyze?analyzer=standard" -d '这是一个商品的标题'
curl -XPOST "http://192.168.199.112:9200/_analyze?analyzer=standard&pertty" -d '这是一个商品的标题'
curl -XPOST "http://192.168.199.112:9200/_analyze?analyzer=ik&pertty" -d '这是一个商品的标题'
curl -XPOST "http://192.168.199.112:9200/_analyze?analyzer=ik_smart&pertty" -d '这是一个商品的标题'
都是词组
ik 默认使用的是最大的分词个数 ik_max_word 和 写 ik 是一样的。
默认就是 ik_max_word
ik 要比 standard 强大的多
创建索引
curl -xPUT "http://192.168.199.112:9200/"
vim createIndex.json
{
"settings":{
"refresh_interval":"5s",
"number_of_shards":1,
"number_of_peplicas":0
},
"mappings":{
"_default_":{
"_all":{
"enabled":true //所有字段都生效
}
},
"products":{
"dynamic":false, //出现新的字段 关闭了
"properties":{
"productid":{
"type":"long"
},
"title":{
type:"string", //此title的类型是string
"index":"analyzed",//创建索引 俺呢来自的
"analyzer":"ik"
},
"descr":{
"type":"string",
"index":"analyzed",
"analyzer":"ik"
}
}
}
}
}

好的,这个创建index.json文件就创建完毕了,那么如何执行呢,
看下面这张图:
curl -XPUT "http://192.168.199.112:9200/imooc_shop" -d'@createindex.json'
那么 imooc_shop 这是一个索引名称,可以自定义这个名称。

当看到 {"acknowledged":true} 后,证明我们的imooc_shop 创建成功。
我们拥有了一个 imooc_shop 的一个索引
完成API 完成数据的添加

//查询
curl -XGET "http://192.168.199.112:9200/imoooc_shop/_search?pertty"
查找存储在ElasticSearch 所有的索引

以上是搜索所有的索引,那么我们如何搜索一个关于苹果的的索引呢?


将红框中的代码改成下面的代码,加入了一个i标签,并赋值class为 highlight
那么我们通过css样式就可以进行定义了。

修改完成后的search.json 就是这样:

好的,search.json 编辑完成后,如何执行?看代码

这是执行的结果:


以上就是索引添加和全文检索的全部过程,看图即可
可以看到是非常好用的。
5.7 结合数据库 把真实的数据添加到elasticSearch中:
可以找到一个叫 elasticSearch-jdbc 的工具包 批量导入到 elasticSearch 中:
通过github 去找 elasticSearch-jdbc 这个工具包 ,然后找到对应版本后,下载到本地
下载完成功,通过unzip解压这个压缩包。
解压完成后,进入 这个目录 cd
这个目录中有两个目录 bin 和 lib 。bin目录 全部是命令
那么我们如何创建一个我们使用的命令呢?
看命令:
那么进入 bin 目录
cp mysql-blog.sh mysql-import-product.sh
复制一个出来,
vim mysql-import-product.sh

9300 是程序和程序之间的一个通讯端口, 9200 是api访问的端口
在yii2中安装使用elasticSearch 组件

等待项目下载完成
https://github.com/yiisoft/yii2-elasticsearch
具体使用步骤按照这个手册来调用


这是actionSearch完整的代码
查询到elasticSearch中的集合,然后进行替换,遍历
遍历就是从数据库中根据ID进行查询,到数据
保存到一个数组,然后返回
数据整理的过程中,可以使用 带有高亮的title 和descr 替换从数据库中查询出来的数据、
这样的数据整理好以后,返回。

从es中获取分页数据是这样写的

使用 elasticSearch-jdbc自动导入增量数据
cp -rp oneFolder/ newFolder 把 oneFolder下所有文件 复制到 newFolder
ln -s newFolder/web 这个软连的命令就是 创建一个web文件夹指向到 newFolder/web 目录
自动更新或添加数据到elasticSearch 中 ,那么应该 怎么做呢?
如果文档ID是相同的,那么应该是更新。
这次的更新、与 添加 是根据时间戳进行判断,mysql表中有两个字段 createtime 和 updatetime
好的,那么使用elasticSearch-jdbc导入工具 自动完成更新与添加
那么这是一个.sh 文件,那么我们怎么导入数据呢?

schedule 秒 分 时 日 月

监听日志
tail-f jdbc.log
上面完成了数据更新和新增,那么 删除怎么做? 这需要手动的创建一个命令 访问 RestFull API 去删除。
behavior 这个yii2中的高级用法。保存完成即可,其他不用在代码中再次调用了。
这个方法定义在 Controller 中

这是服务器运行环境
lnmp1.3-full.tar.gz





