就是在任何场景下,找寻你想要的信息,这个时候,会输入一段你要搜索的关键字,而后就指望找到这个关键字相关的有些信息html
站内搜索node
电商网站,招聘网站,新闻网站,各类apppython
OA软件,办公自动化软件,会议管理,日程管理,项目管理,员工管理,搜索“张三”,“张三儿”,“张小三”;有个电商网站,卖家,后台管理系统,搜索“牙膏”,订单,“牙膏相关的订单”linux
数据都是存储在数据库里面的,好比说电商网站的商品信息,招聘网站的职位信息,新闻网站的新闻信息,若是说从技术的角度去考虑,如何实现如说,电商网站内部的搜索功能的话,就能够考虑,去使用数据库去进行搜索。git
一、每条记录的指定字段的文本,可能会很长,好比说“商品描述”字段的长度,有长达数千个,甚至数万个字符,这个时候,每次都要对每条记录的全部文本进行扫描,来判断说,你包不包含我指定的这个关键词(好比说“牙膏”)
二、还不能将搜索词拆分开来,尽量去搜索更多的符合你的指望的结果,好比输入“生化机”,就搜索不出来“生化危机”github
用数据库来实现搜索,是不太靠谱的。一般来讲,性能会不好的。算法
Lucene是Apache软件基金会中一个开放源代码的全文搜索引擎工具包,是一个全文搜索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便在目标系统中实现全文检索的功能,或者是以此为基础创建起完整的全文搜索引擎。sql
全文检索是指计算机索引程序经过扫描文章中的每个词,对每个词创建一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先创建的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程相似于经过字典中的检索字表查字的过程。全文搜索搜索引擎数据库中的数据。数据库
倒排索引源于实际应用中须要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具备该属性值的各记录的地址因为不是由记录来肯定属性值,而是由属性值来肯定记录的位置,于是称为倒排索引(inverted index)。带有倒排索引的文件咱们称为倒排索引文件,简称倒排文件(inverted file)。倒排索引中的索引对象是文档或者文档集合中的单词等,用来存储这些单词在一个文档或者一组文档中的存储位置,是对文档或者文档集合的一种最经常使用的索引机制。搜索引擎的关键步骤就是创建倒排索引,倒排索引通常表示为一个关键词,而后是它的频度(岀现的次数)、位置(出如今哪一篇文章或网页中,及有关的日期,做者等信息),比如一本书的目录、标签通常。读者想看哪个主题相关的章节,直接根据目录便可找到相关的页面。没必要再从书的第一页到最后一页,一页一页地查找。npm
文档得分:它是一个刻画文档与査询匹配程度的参数。Apache Lucene的默认评分机制:TF/IDF (词频/逆文档频率)算法
当一个文档经Lucene返回,则意味着该文档与用户提交的查询是匹配的。在这种状况下,每一个返回的文档都有一个得分。得分越高,文档相关度更高,同一个文档针对不一样查询的得分是不一样的,比较某文档在不一样查询中的得分是没有意义的。同一文档在不一样查询中的得分不具有可比较性,不一样查询返回文档中的最高得分也不具有可比较性。这是由于文档得分依赖多个因子,除了权重和查询自己的结构,还包括匹配的词项数目,词项所在字段,以及用于查询规范化的匹配类型等。在一些比较极端的状况下,同一个文档在类似查询中的得分很是悬殊,仅仅是由于使用了自定义得分查询或者命中词项数发生了急剧变化。
上面公式糅合了布尔检索模型和向量空间检索模型。想了解更多请百度。
得分公式是一个关于査询q和文档d的函数,有两个因子coord和queryNorm并不直接依赖查询词项,而是与查询词项的一个求和公式相乘。求和公式中每一个加数由如下因子连乘所得:词频、逆文档频率、词项权重、范数。范数就是以前提到的长度范数。
基本规则:
Elasticsearch (ES)是一个基于Lucene构建的开源、分布式、RESTful接口全文搜索引擎Elasticsearch仍是一个分布式文档数据库,其中每一个字段均是被索引的数据且可被搜索,它可以扩展至数以百计的服务器存储以及处理PB级的数据。它能够在很短的时间内存储、搜索和分析大量的数据。它一般做为具备复杂搜索场景状况下的核心发动机。Elasticsearch就是为高可用和可扩展而生的。能够经过购置性能更强的服务器来完成,称为垂直扩展或者向上扩展(Vertical Scale/Scaling Up),或增长更多的服务器来完成,称为水平扩展或者向外扩展(Horizontal Scale/Scaling Out)尽管ES可以利用更强劲的硬件,垂直扩展毕竟仍是有它的极限。真正的可扩展性来自于水平扩展,经过向集群中添加更多的节点来分担负载,增长可靠性。在大多数数据库中,水平扩展一般都须要你对应用进行一次大的重构来利用更多的节点。而ES天生就是分布式的:它知道如何管理多个节点来完成扩展和实现高可用性。这也意味着你的应用不须要作任何的改动。
是ElasticSearch使用了Lucene的评分功能,但好在咱们能够替换默认的评分算法,ElasticSearch使用了Lucene的评分功
能但不只限于Lucene的评分功能。用户可使用各类不一样的查询类型以精确控制文档评分的计算(custom_boost_factor 查询、constant_score 査询、custom_score 查询等),还能够经过使用脚本(scripting)来改变文档得分,还可使用ElasticSearch 0.90中岀现的二次评分功能,经过在返回文档集之上执行另一个查询,从新计算前N个文档的文档得分。
(1)Near Realtime(NRT):近实时,两个意思,从写入数据到数据能够被搜索到有一个小延迟(大概1秒);基于es执行搜索和分析能够达到秒级
(2)Cluster:集群,包含多个节点,每一个节点属于哪一个集群是经过一个配置(集群名称,默认是elasticsearch)来决定的,对于中小型应用来讲,刚开始一个集群就一个节点很正常
(3)Node:节点,集群中的一个节点,节点也有一个名称(默认是随机分配的),节点名称很重要(在执行运维管理操做的时候),默认节点会去加入一个名称为“elasticsearch”的集群,若是直接启动一堆节点,那么它们会自动组成一个elasticsearch集群,固然一个节点也能够组成一个elasticsearch集群
(4)Document&field:文档,es中的最小数据单元,一个document能够是一条客户数据,一条商品分类数据,一条订单数据,一般用JSON数据结构表示,每一个index下的type中,均可以去存储多个document。一个document里面有多个field,每一个field就是一个数据字段。
#product document { "product_id": "1", "product_name": "高露洁牙膏", "product_desc": "高效美白", "category_id": "2", "category_name": "日化用品" }
(5)Index:索引,包含一堆有类似结构的文档数据,好比能够有一个客户索引,商品分类索引,订单索引,索引有一个名称。一个index包含不少document,一个index就表明了一类相似的或者相同的document。好比说创建一个product index,商品索引,里面可能就存放了全部的商品数据,全部的商品document。
(6)Type:类型,每一个索引里均可以有一个或多个type,type是index中的一个逻辑数据分类,一个type下的document,都有相同的field,好比博客系统,有一个索引,能够定义用户数据type,博客数据type,评论数据type。
商品index,里面存放了全部的商品数据,商品document
可是商品分不少种类,每一个种类的document的field可能不太同样,好比说电器商品,可能还包含一些诸如售后时间范围这样的特殊field;生鲜商品,还包含一些诸如生鲜保质期之类的特殊field
type,日化商品type,电器商品type,生鲜商品type
日化商品type:product_id,product_name,product_desc,category_id,category_name
电器商品type:product_id,product_name,product_desc,category_id,category_name,service_period
生鲜商品type:product_id,product_name,product_desc,category_id,category_name,eat_period
#每个type里面,都会包含一堆document { "product_id": "2", "product_name": "长虹电视机", "product_desc": "4k高清", "category_id": "3", "category_name": "电器", "service_period": "1年" } { "product_id": "3", "product_name": "基围虾", "product_desc": "纯自然,冰岛产", "category_id": "4", "category_name": "生鲜", "eat_period": "7天" }
(7)shard:单台机器没法存储大量数据,es能够将一个索引中的数据切分为多个shard,分布在多台服务器上存储。有了shard就能够横向扩展,存储更多数据,让搜索和分析等操做分布到多台服务器上去执行,提高吞吐量和性能。每一个shard都是一个lucene index。
(8)replica:任何一个服务器随时可能故障或宕机,此时shard可能就会丢失,所以能够为每一个shard建立多个replica副本。replica能够在shard故障时提供备用服务,保证数据不丢失,多个replica还能够提高搜索操做的吞吐量和性能。primary shard(创建索引时一次设置,不能修改,默认5个),replica shard(随时修改数量,默认1个),默认每一个索引10个shard,5个primary shard,5个replica shard,最小的高可用配置,是2台服务器。
关系型数据库(好比Mysql) | 非关系型数据库(Elasticsearch) |
---|---|
数据库Database | 索引Index |
表Table | 类型Type |
数据行Row | 文档Document |
数据列Column | 字段Field |
约束 Schema | 映射Mapping |
HTTP方法 | 数据处理 | 说明 |
---|---|---|
POST | Create | 新增一个没有ID的资源 |
GET | Read | 取得一个资源 |
PUT | Update | 更新一个资源。或新增一个含ID的资源(若是1D不存在) |
DELETE | Delete | 删除一个资源 |
Elasticsearch官网: https://www.elastic.co/products/elasticsearch
1)解压elasticsearch-5.2.2.tar.gz到/opt/module目录下
tar -zxvf elasticsearch-5.2.2.tar.gz -C /opt/module/
2)在/opt/module/elasticsearch-5.2.2路径下建立data和logs文件夹
mkdir data mkdir logs
3)修改配置文件/opt/module/elasticsearch-5.2.2/config/elasticsearch.yml
# ---------------------------------- Cluster ----------------------------------- cluster.name: my-application # ------------------------------------ Node ------------------------------------ node.name: node-102 # ----------------------------------- Paths ------------------------------------ path.data: /opt/module/elasticsearch-5.2.2/data path.logs: /opt/module/elasticsearch-5.2.2/logs # ----------------------------------- Memory ----------------------------------- bootstrap.memory_lock: false bootstrap.system_call_filter: false # ---------------------------------- Network ----------------------------------- network.host: 192.168.1.11 #本身ip # --------------------------------- Discovery ---------------------------------- discovery.zen.ping.unicast.hosts: ["elasticsearch"] #本身主机名 #注意 (1)cluster.name若是要配置集群须要两个节点上的elasticsearch配置的cluster.name相同,都启动能够自动组成集群,这里若是不改cluster.name则默认是cluster.name=my-application, (2)nodename随意取可是集群内的各节点不能相同 (3)修改后的每行前面不能有空格,修改后的“:”后面必须有一个空格
4)配置Linux系统
切换到root用户,
#编辑/etc/security/limits.conf添加相似以下内容 * soft nofile 65536 * hard nofile 131072 * soft nproc 2048 * hard nproc 4096
#编辑 /etc/security/limits.d/90-nproc.conf * soft nproc 1024 #修改成 * soft nproc 4096
#编辑 vi /etc/sysctl.conf vm.max_map_count=655360 fs.file-max=655360
sysctl -p 从新启动elasticsearch,便可启动成功。
#测试集群 curl http://elasticsearch:9200 { "name" : "node-1", "cluster_name" : "my-application", "cluster_uuid" : "mdLmu1rOS7qPNfToNOXzKA", "version" : { "number" : "5.2.2", "build_hash" : "f9d9b74", "build_date" : "2017-02-24T17:26:45.835Z", "build_snapshot" : false, "lucene_version" : "6.4.1" }, "tagline" : "You Know, for Search" }
https://github.com/mobz/elasticsearch-head elasticsearch-head-master.zip
https://nodejs.org/dist/ node-v6.9.2-linux-x64.tar.xz
tar -zxvf node-v6.9.2-linux-x64.tar.gz -C /opt/module/ vi /etc/profile export NODE_HOME=/opt/module/node-v6.9.2-linux-x64 export PATH=$PATH:$NODE_HOME/bin source /etc/profile
node -v v6.9.2 npm -v 3.10.9
unzip elasticsearch-head-master.zip -d /opt/module/
npm config set registry https://registry.npm.taobao.org npm config list / npm config get registery #检查是否替换成功
npm install -g cnpm --registry=https://registry.npm.taobao.org
npm install -g grunt-cli
#文件93行添加hostname:'0.0.0.0' options: { hostname:'0.0.0.0', port: 9100, base: '.', keepalive: true }
#检查head根目录下是否存在base文件夹 #没有:将 _site下的base文件夹及其内容复制到head根目录下 mkdir base cp base/* ../base/
grunt server -d #若是提示grunt的模块没有安装: Local Npm module “grunt-contrib-clean” not found. Is it installed? Local Npm module “grunt-contrib-concat” not found. Is it installed? Local Npm module “grunt-contrib-watch” not found. Is it installed? Local Npm module “grunt-contrib-connect” not found. Is it installed? Local Npm module “grunt-contrib-copy” not found. Is it installed? Local Npm module “grunt-contrib-jasmine” not found. Is it installed? Warning: Task “connect:server” not found. Use –force to continue. #执行如下命令: npm install grunt-contrib-clean -registry=https://registry.npm.taobao.org npm install grunt-contrib-concat -registry=https://registry.npm.taobao.org npm install grunt-contrib-watch -registry=https://registry.npm.taobao.org npm install grunt-contrib-connect -registry=https://registry.npm.taobao.org npm install grunt-contrib-copy -registry=https://registry.npm.taobao.org npm install grunt-contrib-jasmine -registry=https://registry.npm.taobao.org #最后一个模块可能安装不成功,可是不影响使用。
在/opt/module/elasticsearch-5.2.2/config路径下修改配置文件elasticsearch.yml,在文件末尾增长 http.cors.enabled: true http.cors.allow-origin: "*" #重启ElasticSearch #重启插件