作为程序员一定要保持良好的睡眠,才能好编程

ElasticSearch 全文检索 介绍说明

发布时间:2018-02-22

ElasticSearch   英 [ɪ'læstɪk]

  • adj. 灵活的;有弹性的;可变的

  • n. 橡皮圈;有松紧的东西



全文数据的检索    这个简称  ES


两种检索方式:

顺序扫描法  慢

索引扫描法  

全文检索的基本思路,即将非结构化数据中的一部分信息提取出来,重新组织,使变得有一定的结构,然后对此有一定结构的数据进行检索,从而达到搜索相对较快的目的。




全文检索的过程


1、索引的创建


2、索引的搜索



索引保存了什么?  也就是文档的ID

1.jpg

例如 hadoop  保存了 35  77  100  那么这三个数字就是 文档的ID   这些都是  倒序表  


索引只会创建一次  ,比顺序扫描法  快的多


创建索引的步骤:


1、找到要提取关键字的文章


2、将文章传递给分词组件  Tokenizer

    将文档分成一个一个的单词、去除标点符号 、去除停词

3、交给语言处理组件 LinuisticProcessor

4、将得到的词(Term)传给索引组件 (Indexer)

    利用得到的词Term创建一个字典

    对字典按字母顺序进行排序

    合并相同过的词(Term)成为文档倒排(Posting List)链表

    

2.jpg


以上是索引创建的步骤。


那么看看搜索索引是怎么工作的:


第一步:用户输入查询搜索语句

第二步:对查询语句进行词法分析,语法分析及语言处理

第三步:搜索索引,得到符合文档





全文检索引擎是目前广泛应用主流搜索引擎。




全文检索的主要开源的产品


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"
                  }            
            }
        }
        
        
    }

}


截图11.jpg

截图12.jpg


好的,这个创建index.json文件就创建完毕了,那么如何执行呢,

看下面这张图:


curl -XPUT "http://192.168.199.112:9200/imooc_shop" -d'@createindex.json'


那么  imooc_shop  这是一个索引名称,可以自定义这个名称。


截图13.jpg


当看到 {"acknowledged":true}  后,证明我们的imooc_shop 创建成功。

我们拥有了一个 imooc_shop 的一个索引



完成API  完成数据的添加

截图14.jpg



//查询

curl -XGET "http://192.168.199.112:9200/imoooc_shop/_search?pertty"


查找存储在ElasticSearch 所有的索引


截图15.jpg


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



截图16.jpg


截图17.jpg


将红框中的代码改成下面的代码,加入了一个i标签,并赋值class为 highlight 

那么我们通过css样式就可以进行定义了。

截图18.jpg





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

截图22.jpg


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

截图21.jpg


这是执行的结果:


截图19.jpg

截图20.jpg


以上就是索引添加和全文检索的全部过程,看图即可


可以看到是非常好用的。



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


截图23.jpg



9300 是程序和程序之间的一个通讯端口,  9200 是api访问的端口



在yii2中安装使用elasticSearch 组件 

截图24.jpg

等待项目下载完成

https://github.com/yiisoft/yii2-elasticsearch


具体使用步骤按照这个手册来调用



截图25.jpg

截图26.jpg

这是actionSearch完整的代码


查询到elasticSearch中的集合,然后进行替换,遍历

遍历就是从数据库中根据ID进行查询,到数据

保存到一个数组,然后返回

数据整理的过程中,可以使用 带有高亮的title 和descr 替换从数据库中查询出来的数据、

这样的数据整理好以后,返回。

截图27.jpg



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

截图28.jpg



使用 elasticSearch-jdbc自动导入增量数据



cp -rp oneFolder/  newFolder   把 oneFolder下所有文件 复制到 newFolder


ln -s newFolder/web   这个软连的命令就是 创建一个web文件夹指向到  newFolder/web 目录




自动更新或添加数据到elasticSearch 中 ,那么应该 怎么做呢?


如果文档ID是相同的,那么应该是更新。

这次的更新、与 添加  是根据时间戳进行判断,mysql表中有两个字段  createtime 和  updatetime


好的,那么使用elasticSearch-jdbc导入工具  自动完成更新与添加


那么这是一个.sh 文件,那么我们怎么导入数据呢?  

截图30.jpg


schedule 秒 分 时 日 月



截图31.jpg



监听日志

tail-f jdbc.log


上面完成了数据更新和新增,那么 删除怎么做?  这需要手动的创建一个命令 访问 RestFull API 去删除。





behavior 这个yii2中的高级用法。保存完成即可,其他不用在代码中再次调用了。

这个方法定义在 Controller 中

截图29.jpg






这是服务器运行环境

lnmp1.3-full.tar.gz











es1.png




es2.png



es3.png



es4.png


es6.png


es7.png