认识elasticsearch
搜索引擎
搜索引擎依托于多种技术,如网络爬虫技术、检索排序技术、网页处理技术、大数据处理技术、自然语言处理技术等,
为信息检索用户提供快速、高相关性的信息服务。搜索引擎技术的核心模块一般包括爬虫、索引、检索和排序等,
同时可添加其他一系列辅助模块,以为用户创造更好的网络使用环境。
搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上采集信息,在对信息进行组织和处理后,为用户提供检索服务,将检索的相关信息展示给用户的系统。搜索引擎是工作于互联网上的一门检索技术,它旨在提高人们获取搜集信息的速度,为人们提供更好的网络使用环境。从功能和原理上搜索引擎大致被分为全文搜索引擎、元搜索引擎、垂直搜索引擎和目录搜索引擎等四大类
-
分类
-
全文搜索引擎
一般网络用户适用于全文搜索引擎。这种搜索方式方便、简捷,并容易获得所有相关信息。但搜索到的信息过于庞杂,因此用户需要逐一浏览并甄别出所需信息。尤其在用户没有明确检索意图情况下,这种搜索方式非常有效
-
元搜索引擎
元搜索引擎适用于广泛、准确地收集信息。不同的全文搜索引擎由于其性能和信息反馈能力差异,导致其各有利弊。元搜索引擎的出现恰恰解决了这个问题,有利于各基本搜索引擎间的优势互补。而且本搜索方式有利于对基本搜索方式进行全局控制,引导全文搜索引擎的持续改善
-
垂直搜索引擎
垂直搜索引擎适用于有明确搜索意图情况下进行检索。例如,用户购买机票、火车票、汽车票时,或想要浏览网络视频资源时,都可以直接选用行业内专用搜索引擎,以准确、迅速获得相关信息。
-
目录搜索引擎
目录搜索引擎是网站内部常用的检索方式。本搜索方式旨在对网站内信息整合处理并分目录呈现给用户,但其缺点在于用户需预先了解本网站的内容,并熟悉其主要模块构成。总而观之,目录搜索方式的适应范围非常有限,且需要较高的人工成本来支持维护
-
-
特点
- 1、信息抓取迅速。【爬虫】[数据怎么获取]
- 2、深入开展信息挖掘。【数据挖掘】[数据怎么处理]
- 3、检索内容的多样化和广泛性。【搜索技术】[数据怎么查询]
-
应用场景
1、社会化搜索
社交网络平台和应用占据了互联网的主流,社交网络平台强调用户之间的联系和交互,这对传统的搜索技术提出了新的挑战。
传统搜索技术强调搜索结果和用户需求的相关性,社会化搜索除了相关性外,还额外增加了一个维度,即搜索结果的可信赖性。对某个搜索结果,传统的结果可能成千上万,但如果处于用户社交网络内其他用户发布的信息、点评或验证过的信息则更容易信赖,这是与用户的心里密切相关的。社会化搜索为用户提供更准确、更值得信任的搜索结果。
2、实时搜索
对搜索引擎的实时性要求日益增高,这也是搜索引擎未来的一个发展方向。
实时搜索最突出的特点是时效性强,越来越多的突发事件首次发布在微博上,实时搜索核心强调的就是“快”,用户发布的信息第一时间能被搜索引擎搜索到。不过在国内,实时搜索由于各方面的原因无法普及使用,比如Google的实时搜索是被重置的,百度也没有明显的实时搜索入口。
3、移动搜索
随着智能手机的快速发展,基于手机的移动设备搜索日益流行,但移动设备有很大的局限性,比如屏幕太小,可显示的区域不多,计算资源能力有限,打开网页速度很慢,手机输入繁琐等问题都需要解决。
目前,随着智能手机的快速普及,移动搜索一定会更加快速的发展,所以移动搜索的市场占有率会逐步上升,而对于没有移动版的网站来说,百度也提供了“百度移动开放平台”来弥补这个缺失。
4、个性化搜索
个性化搜索主要面临两个问题:如何建立用户的个人兴趣模型?在搜索引擎里如何使用这种个人兴趣模型?
个性化搜索的核心是根据用户的网络行为,建立一套准确的个人兴趣模型。而建立这样一套模型,就要全民收集与用户相关的信息,包括用户搜索历史、点击记录、浏览过的网页、用户E-mail信息、收藏夹信息、用户发布过的信息、博客、微博等内容。比较常见的是从这些信息中提取出关键词及其权重。为不同用户提供个性化的搜索结果,是搜索引擎总的发展趋势,但现有技术有很多问题,比如个人隐私的泄露,而且用户的兴趣会不断变化,太依赖历史信息,可能无法反映用户的兴趣变化。
5、地理位置感知搜索
目前,很多手机已经有GPS的应用了,这是基于地理位置感知的搜索,而且可以通过陀螺仪等设备感知用户的朝向,基于这种信息,可以为用户提供准确的地理位置服务以及相关搜索服务。目前,此类应用已经大行其道,比如手机地图APP。
6、跨语言搜索
如何将中文的用户查询翻译为英文查询,目前主流的方法有3种:机器翻译、双语词典查询和双语语料挖掘。对于一个全球性的搜索引擎来说,具备跨语言搜索功能是必然的发展趋势,而其基本的技术路线一般会采用查询翻译加上网页的机器翻译这两种技术手段。
7、多媒体搜索
目前,搜索引擎的查询还是基于文字的,即使是图片和视频搜索也是基于文本方式。那么未来的多媒体搜索技术则会弥补查询这一缺失。多媒体形式除了文字,主要包括图片、音频、视频。多媒体搜索比纯文本搜索要复杂许多,一般多媒体搜索包含4个主要步骤:多媒体特征提取、多媒体数据流分割、多媒体数据分类和多媒体数据搜索引擎。
8、情境搜索
情境搜索是融合了多项技术的产品,上面介绍的社会化搜索、个性化搜索、地点感知搜索等都是支持情境搜索的,目前Google在大力提倡这一概念。所谓情境搜索,就是能够感知人与人所处的环境,针对“此时此地此人”来建立模型,试图理解用户查询的目的,根本目标还是要理解人的信息需求。比如某个用户在苹果专卖店附近发出“苹果”这个搜索请求,基于地点感知及用户的个性化模型,搜索引擎就有可能认为这个查询是针对苹果公司的产品,而非对水果的需求。
常见全文搜索引擎框架
https://blog.csdn.net/business122/article/details/78064092
-
Lucene
Lucene的开发语言是Java,也是Java家族中最为出名的一个开源搜索引擎,在Java世界中已经是标准的全文检索程序,它提供了完整的查询引擎和索引引擎,没有中文分词引擎,需要自己去实现,因此用Lucene去做一个搜素引擎需要自己去架构,另外它不支持实时搜索。但是solr和elasticsearch都是基于Lucene封装。
1.2 优点
成熟的解决方案,有很多的成功案例。apache 顶级项目,正在持续快速的进步。庞大而活跃的开发社区,大量的开发人员。它只是一个类库,有足够的定制和优化空间:经过简单定制,就可以满足绝大部分常见的需求;经过优化,可以支持 10亿+ 量级的搜索。
1.3 缺点
需要额外的开发工作。所有的扩展,分布式,可靠性等都需要自己实现;非实时,从建索引到可以搜索中间有一个时间延迟,而当前的“近实时”(Lucene Near Real Time search)搜索方案的可扩展性有待进一步完善.
-
Apache Solr
Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服务器。文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提 供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。
2.2 优点
(1)Solr有一个更大、更成熟的用户、开发和贡献者社区。
(2)支持添加多种格式的索引,如:HTML、PDF、微软 Office 系列软件格式以及 JSON、XML、CSV 等纯文本格式。
(3)Solr比较成熟、稳定。
(4)不考虑建索引的同时进行搜索,速度更快。
2.3 缺点
建立索引时,搜索效率下降,实时索引搜索效率不高
-
ElasticSearch
ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。支持通过HTTP使用JSON进行数据索引。
3.2 优点
(1)Elasticsearch是分布式的。不需要其他组件,分发是实时的,被叫做”Push replication”。
(2)Elasticsearch 完全支持 Apache Lucene 的接近实时的搜索。
(3)处理多租户(multitenancy)不需要特殊配置,而Solr则需要更多的高级设置。
(4)Elasticsearch 采用 Gateway 的概念,使得完备份更加简单。
各节点组成对等的网络结构,某些节点出现故障时会自动分配其他节点代替其进行工作。
3.3 缺点
还不够自动(不适合当前新的Index Warmup API) 索引预热API
-
ES or Solr
https://www.cnblogs.com/jajian/p/9801154.html
什么是elasticsearch
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
1>基于Apache Lucene 构建的开源搜索引擎
2>才有java编写的,提供简单易用的RESTFul API
3>轻松的横向拓展, 可以支持PB级的结构化或非结构化数据处理
在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。
-
定位
实时的全文搜索引擎
近实时:数据更新有1秒的延时
在操作上
狭义的上的理解:
专注于 搜索 的 非关系型 数据库
类似于mongodb
-
数据获取
1:爬虫获取数据
2:从关系型数据库同步数据
涉及到ES使用方式
-
数据处理
存储:
es是一种类似于非关系型数据库的方式存放数据
数据存储结构类似mongodb文档结构,但是比mongodb更为复杂
处理
涉及到数据分词,倒排等相关操作
-
数据检索
全文搜索
高亮搜索
条件搜索
-
elasticsearch应用场景
1、社会化搜索
2、实时搜索
3、移动搜索
4、个性化搜索
5、地理位置感知搜索
6、跨语言搜索
7、多媒体搜索
8、情境搜索
我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。因此我们利用Elasticsearch来解决所有这些问题及可能出现的更多其它问题。
适用场景:
1>海量数据分析引擎
2>站内搜索引擎
3>数据仓库
一线公司使用:
英国卫报-实时分析公众对文章的回应
维基百科,github - 站内实时搜索
百度-实时日志监控平台
阿里 google 京东 小米 华为
- 多条件搜索
- 站内搜索
- 地理位置搜索
elasticsearch的安装
-
ES服务器
1:Java编写的解压即用的软件,只需要有Java的运行环境即可,把压缩包解压后,进入到bin目录运行elasticsearch.bat
2:浏览器输入:http://localhost:9200,看到浏览器输出服务器的信息,表示安装成功,可以使用了
-
版本了解
1.x
2.x
5.x
6.x
7.x
注意没有3, 4
原因:elk 技术整合
版本选择:
最先版本 7.x 6.x 都可以
-
-
ES可视化客户端-head
Elasticsearch默认的客户端工具是命令行形式的,操作起来不方便,也不直观看到数据的展示,所以我们需要去安装一个可视化插件,但是这些插件都是基于H5开发的,在谷歌的应用商店中找到elasticsearch-head插件,然后安装,使用该插件能比较直观的展示服务器中的数据
- 观察ES数据
-
ES操作客户端-kibana
步骤1:下载kibana
https://www.elastic.co/cn/downloads/kibana
注意:版本必须跟es一致
步骤2:修改配置
根/config/kibana.yml
都是默认情况,可以不用修改
步骤3:启动kibana
根/bin/kibana
步骤4:访问客户端
http://localhost:5601
- 操作ES数据
-
分词器
-
网上找分词器的压缩包然后进行下面步骤解压
直接把压缩文件中的内容解压,然后放在elasticsearch/plugins下,然后重启即可
核心概念
索引(Index)
含有相同属性的文档集合
文档(Document)
文档可以被索引的基本单位, 一般是json格式,包含一些field
列(Field)
es的最小单位,相当于数据的某个列
类比
常规操作
索引操作
-
添加
语法:PUT /索引名
在没有特殊设置的情况下,默认有1个分片,1个备份,也可以通过请求参数的方式来指定
参数格式:
默认:
PUT my_index明确指定:
PUT /my_index
{
“settings”: {
“number_of_shards”: 5, //设置5个片区
“number_of_replicas”: 1 //设置1个备份
}
}
注意:
1:索引不能有大写字母
2:参数格式必须是标准的json格式 -
查看
#看单个
GET /索引名
#看所有
GET _cat/indices -
删除
语法:DELETE /索引名
设置映射(列)
-
创建
类型跟映射一起创建
语法:PUT /索引名 { "mappings": { "properties": { 字段名: { "type": 字段类型, "analyzer": 分词器类型, "search_analyzer": 分词器类型, ... }, ... } } }
字段类型就是:数据类型
配置:analyzer search_analyzer 前提是 type:text类型
创建类型并设置映射(类似于mysql创建表)
eg: PUT /my_index { "mappings": { "properties":{ "id":{ "type":"long" }, "name":{ "type":"keyword" }, "age":{ "type":"integer" } } } }
-
查看
语法:GET /索引名/_mapping
需求: 查看映射
GET /my_index/_mapping
文档操作
数据类型
https://www.jianshu.com/p/01f489c46c38
有很多很多
核心类型:
text 类型:当一个字段是要被全文搜索的,比如Email内容、产品描述,应该使用text类型。设置text类型以后,字段内容会被分析,在生成倒排索引以前,字符串会被分析器分成一个一个词项。text类型的字段不用于排序,很少用于聚合。
keyword类型:适用于索引结构化的字段,比如email地址、主机名、状态码和标签。如果字段需要进行过滤(比如查找已发布博客中status属性为published的文章)、排序、聚合。keyword类型的字段只能通过精确值搜索到。
数值 类型:
byte
short
integer
doule
float
date类型
boolean类型
binary类型
array类型
object类型
ip类型
文档基本操作
-
文档添加
语法:
//必须明确指定id-推荐
PUT /索引名/_doc/文档ID
{
field1: value1,
field2: value2,
…
}
//不指定指定id默认使用随机字符串
POST /索引名/_doc
{
field1: value1,
field2: value2,
…
}
注意:
1:当索引/映射不存在时,会使用默认设置自动添加
2:ES中的数据一般是从别的数据库导入的,所以文档的ID会沿用原数据库中的ID
3:操作时,如果指定文档id, 并且索引库中已经存在, 则执行更新操作, 否则执行添加
4:不指定id的添加, es会指定添加一个字符串类型id
结果字段解释:
_index:所属索引
_type:所属类型
_id:文档ID
_version:乐观锁版本号
_source:数据内容
result : 命令操作类型
_shards: 分片相关信息
需求1:新增一个文档
PUT /my_index/_doc/1
{
“id”:1,
“name”:“xiaoming”,
“age”:18
}
-
文档更新
语法:
PUT /索引名/_doc/文档ID
{
field1: value1,
field2: value2,
…
}
注意:
1:如果不指定id, 操作失败
需求2:替换一个文档
PUT /my_index/_doc/1 { "id":1, "name":"xiaoming", "age":18 } { "_index" : "es_index", "_type" : "users", "_id" : "1", "_version" : 2, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 3, "_primary_term" : 1 }
部分更新字段
POST /my_index/_update/1/ { "doc":{ "name":"xiaoming" } }
-
文档查看
语法:
根据ID查询 -> GET /索引名/_doc/文档ID
查询所有(基本查询语句) -> GET /索引名/_doc/_search
结果字段解释:
took:耗时
_shards.total:分片总数
hits.total:查询到的数量
hits.max_score:最大匹配度
hits.hits:查询到的结果
hits.hits._score:匹配度
需求1:根据文档ID查询一个文档
GET /my_index/_doc/1 { "_index" : "es_index", "_type" : "users", "_id" : "1", "_version" : 4, "_seq_no" : 3, "_primary_term" : 1, "found" : true, "_source" : { "id" : 1, "name" : "xiaofei", "age" : 18 } }
需求2:查询所有的文档
GET /my_index/_search #默认查询10个
-
文档删除
语法:DELETE /索引名/类型名/文档ID
注意:这里的删除并且不是真正意义上的删除,仅仅是清空文档内容而已,并且标记该文档的状态为删除
需求1:根据文档ID删除一个文档
DELETE /my_index/_doc/1
需求2:又添加刚刚删除的文档
PUT /my_index/_doc/1 { "id":1, "name":"dafei", "age":18 }
注意:
1:es中的删除并不会将数据真实删除,仅仅是修改数据中状态
全文搜索
-
数据准备
PUT /product
{
“mappings”: {
"properties": { "id": { "type": "long" }, "title": { "type": "text", "analyzer": "ik_smart", "search_analyzer": "ik_smart", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "price": {"type": "integer"}, "intro": { "type": "text", "analyzer": "ik_smart", "search_analyzer": "ik_smart", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "brand": { "type": "keyword" } } } }
POST /product/_bulk { "create":{ "_id": 1}} { "id":1,"title":"Apple iPhone XR (A2108) 128GB 白色 移动联通电信4G手机 双卡双待","price":5299,"intro":"【iPhoneXR限时特惠!】6.1英寸视网膜显示屏,A12仿生芯片,面容识别,无线充电,支持双卡!选【换修无忧版】获 AppleCare 原厂服务,享只换不修!更有快速换机、保值换新、轻松月付!","brand":"Apple"} { "create":{ "_