赞
踩
Elasticsearch和lucene的关系
Elasticsearch是基于lucene,做了一些增强和封装。
lucene是一个全文检索殷勤工具包,API十分繁琐,它包含索引结构,读写索引的工具,排序,搜索规则,工具类。
Elaticsearch,简称为es,es是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别(大数据时代)的数据。es也使用java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
谁在使用:
1、维基百科,类似百度百科,全文检索,高亮,搜索推荐/2
2、The Guardian (国外新闻网站) ,类似搜狐新闻,用户行为日志(点击,浏览,收藏,评论) +社交网络数据(对某某新闻的相关看法) ,数据分析,给到每篇新闻文章的作者,让他知道他的文章的公众反馈(好,坏,热门,垃圾,鄙视,崇拜)
3、Stack Overflow (国外的程序异常讨论论坛) , IT问题,程序的报错,提交上去,有人会跟你讨论和回答,全文检索,搜索相关问题和答案,程序报错了,就会将报错信息粘贴到里面去,搜索有没有对应的答案
4、GitHub (开源代码管理),搜索 上千亿行代码
5、电商网站,检索商品
6、日志数据分析, logstash采集日志, ES进行复杂的数据分析, ELK技术, elasticsearch+logstash+kibana
7、商品价格监控网站,用户设定某商品的价格阈值,当低于该阈值的时候,发送通知消息给用户,比如说订阅牙膏的监控,如果高露洁牙膏的家庭套装低于50块钱,就通知我,我就去买
8、BI系统,商业智能, Business Intelligence。比如说有个大型商场集团,BI ,分析一下某某区域最近3年的用户消费 金额的趋势以及用户群体的组成构成,产出相关的数张报表, **区,最近3年,每年消费金额呈现100%的增长,而且用户群体85%是高级白领,开-个新商场。ES执行数据分析和挖掘, Kibana进行数据可视化
9、国内:站内搜索(电商,招聘,门户,等等),IT系统搜索(OA,CRM,ERP,等等),数据分析(ES热门
的一一个使用场景)
Elasticsearch是一个实时分布式搜索和分析引擎。 它让你以前所未有的速度处理大数据成为可能。
它用于全文搜索、结构化搜索、分析以及将这三者混合使用:
维基百科使用Elasticsearch提供全文搜索并高亮关键字,以及输入实时搜索(search-asyou-type)和搜索纠错(did-you-mean)等搜索建议功能。
英国卫报使用Elasticsearch结合用户日志和社交网络数据提供给他们的编辑以实时的反馈,以便及时了解公众对新发表的文章的回应。
StackOverflow结合全文搜索与地理位置查询,以及more-like-this功能来找到相关的问题和答案。
Github使用Elasticsearch检索1300亿行的代码。
但是Elasticsearch不仅用于大型企业,它还让像DataDog以及Klout这样的创业公司将最初的想法变成可扩展的解决方案。
Elasticsearch可以在你的笔记本上运行,也可以在数以百计的服务器上处理PB级别的数据。
Elasticsearch是一个基于Apache Lucene™的开源搜索引擎。无论在开源还是专有领域, Lucene可被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
但是, Lucene只是一个库。 想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是, Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。
Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
Solr是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化
Solr可以独立运行,运行在letty. Tomcat等这些Selrvlet容器中 , Solr 索引的实现方法很简单,用POST方法向Solr服务器发送一个描述Field及其内容的XML文档, Solr根据xml文档添加、删除、更新索引。Solr 搜索只需要发送HTTP GET请求,然后对Solr返回xml、json等格式的查询结果进行解析,组织页面布局。
Solr不提供构建UI的功能, Solr提供了一个管理界面,通过管理界面可以查询Solr的配置和运行情况。
Solr是基于lucene开发企业级搜索服务器,实际上就是封装了lucene.
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交-定格式的文件,生成索引;也可以通过提出查找请求,并得到返回结果。
总结
4. es基本是开箱即用(解压就可以用!) ,非常简单。Solr安装略微复杂一丢丢!
5. Solr 利用Zookeeper进行分布式管理,而Elasticsearch自身带有分布式协调管理功能。
6. Solr 支持更多格式的数据,比如JSON、XML、 CSV ,而Elasticsearch仅支持json文件格式。
7. Solr 官方提供的功能更多,而Elasticsearch本身更注重于核心功能,高级功能多有第三方插件提供,例如图形化界面需要kibana友好支撑
8. Solr 查询快,但更新索引时慢(即插入删除慢) ,用于电商等查询多的应用;
- ES建立索引快(即查询慢) ,即实时性查询快,用于facebook新浪等搜索。
- Solr是传统搜索应用的有力解决方案,但Elasticsearch更适用于新兴的实时搜索应用。
9. Solr比较成熟,有一个更大,更成熟的用户、开发和贡献者社区,而Elasticsearch相对开发维护者较少,更新太快,学习使用成本较高。
JDK1.8以上
使用Java开发,必须保证ElasticSearch的版本与Java的核心jar包版本对应
下载地址:https://www.elastic.co/cn/downloads/
历史版本下载:https://www.elastic.co/cn/downloads/past-releases/
视频资源是7.6.1,就用7.6.1,免得出现版本问题
bin目录下
默认访问地址:127.0.0.1:9200
访问默认地址看看
依赖
npm install
npm run start
启动成功,访问一下
如果健康值不是绿色的,存在跨域问题,开启跨域(在elasticsearch目录config下elasticsearch.yml中添加以下内容)
# 开启跨域访问支持,默认为false
http.cors.enabled: true
# 跨域访问允许的域名地址
http.cors.allow-origin: "*"
配置完成重启服务
索引 可以看做 “数据库” 类型
可以看做 “表” 文档
可以看做 “库中的数据(表中的行)”
ES HEAD,我们只是把它当做可视化数据展示工具,之后所有的查询都在kibana中进行
因为不支持json格式化,不方便
https://www.elastic.co/cn/downloads/past-releases/
http://localhost:5601
kibana
目录找到config
,然后找到kibana.yml
kibana.yml
后改变i18
ElasticSearch是面向文档,关系行数据库和ElasticSearch客观对比!一切都是JSON!
Relational DB | ElasticSearch |
---|---|
数据库(database) | 索引(indices) |
表(tables) | types (慢慢会被弃用) |
行(rows) | documents |
字段(columns) | fields |
elasticsearch(集群)中可以包含多个索引(数据库) ,每个索引中可以包含多个类型(表) ,每个类型下又包含多个文档(行) ,每个文档中又包含多个字段(列)
es只要启动,就是一个集群,默认集群名是elasticsearch
name:zhangsan
name:lisi
name:wangwu
elasticsearch是面向文档的,索引和搜索数据的最小单位是文档
分词:即把一段中文或者别的划分成一个个的关键字
IK提供了两个分词算法: ik_smart
和ik_max_word
,其中ik_smart
为最少切分, ik_max_word
为最细粒度划分
https://github.com/medcl/elasticsearch-analysis-ik/releases
尽量下载版本对应的
在ElastciSearch文件夹下的plugins中创建一个文件夹,命名ik,然后把下载好的压缩包解压到ik中
显示了加载了ik插件
elasticsearch-plugin list
如果不确定有没有加载插件,也可以在ES的bin目录下使用命令查看elasticsearch-plugin list
使用kibana测试
最小切分
最细粒度划分
dic
文件,可以打开一个看一下dic
,随便命名,但是也别太奇葩了。这里新建名叫wzw.dic
,内容如下,然后保存dic
添加到配置文件中,IKAnalyzer.cfg.xml
,如果有多个,用英文逗号分隔method | url地址 | 描述 |
---|---|---|
PUT(创建,修改) | localhost:9200/索引名称/类型名称/文档id | 创建文档(指定文档id) |
POST(创建) | localhost:9200/索引名称/类型名称 | 创建文档(随机文档id) |
POST(修改) | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
DELETE(删除) | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
GET(查询) | localhost:9200/索引名称/类型名称/文档id | 查询文档通过文档ID |
POST(查询) | localhost:9200/索引名称/类型名称/文档id/_search | 查询所有数据 |
打开ES-HEAD,访问地址,点击动作,然后选择删除,在输入删除,删除完成
类型名以后不使用
PUT /索引名/类型名/文档id
{请求体}
PUT /test1/type1/1
{
"name" : "张三",
"age" : 18
}
查看数据
创建规则
创建索引和字段都成功了
获得规则,通过GET获得具体信息
如果文档字段没有指定默认类型,ES会自动配置数据类型
通过get _cat/
可以获取ElasticSearch的当前的很多信息
GET _cat/indices GET _cat/aliases GET _cat/allocation GET _cat/count GET _cat/fielddata GET _cat/health GET _cat/indices GET _cat/master GET _cat/nodeattrs GET _cat/nodes GET _cat/pending_tasks GET _cat/plugins GET _cat/recovery GET _cat/repositories GET _cat/segments GET _cat/shards GET _cat/snapshots GET _cat/tasks GET _cat/templates GET _cat/thread_pool
两种方式
_update
修改,只修改doc中的值,其他值不变,也不会丢失POST /test3/_doc/1/_update
{
"doc":{
"name":"张三2"
}
}
doc里面就是要修改的文档
查看结果,字段没有遗失,也修改成功了
DELETE test1
指定库就删库,指定文档就删除指定库下的文档
DELETE /test2/_doc/1
match在匹配时会对所查找的关键词进行分词,然后按分词匹配查找,而term会直接对关键词进行查找。一般模糊查找的时候,多用match,而精确查找时可以使用term。
PUT /wzw/user/1
{
"name":"zhangsan",
"age":20,
"desc":"今天下大雨了,明天也要下",
"tages":["今天","明天","后天"]
}
GET /wzw/user/_search?q=name:zhangsan
查不到的话是因为分词器没有这个词
match
:匹配(会使用分词器解析(先分析文档,然后进行查询))
_source
:过滤字段
sort
:排序
form、size
分页
_source
过滤字段
没有加条件,查询的是所有字段,通过_source
只查询想要的字段,相当于select name from这个效果,不加的话,就是select * from这个效果
GET wzw/user/_search
{
"query": {
"match": {
"name": "华为云"
}
},
"_source":["name"]
}
sort
降序排列,跟数据的排序一个效果
GET wzw/user/_search { "query": { "match": { "name": "华为云" } }, "sort":[ { "price":{ "order":"desc" } } ] }
form、size
分页,相当于mysql的limit
GET wzw/user/_search { "query": { "match": { "name": "华为云" } }, "sort":[ { "price":{ "order":"desc" } } ], "from": 0, "size": 2 }
where id=1 and name=***
where id=1 or name=***
where id !=20
gt > 大于
gte >= 大于等于
lt < 小于
lte <= 小于等于
PUT testdb/_doc/3 { "t1": "22", "t2": "2022-5-13" } PUT testdb/_doc/4 { "t1": "33", "t2": "2022-5-19" } GET testdb/_search { "query": { "bool": { "should": [ { "term": { "t1": "22" } }, { "term": { "t1": "33" } } ] } } }
支持分词,全文检索、支持模糊、精确查询,不支持聚合,排序操作;
text类型的最大支持的字符长度无限制,适合大字段存储;
不进行分词,直接索引、支持模糊、支持精确匹配,支持聚合、排序操作。
keyword类型的最大支持的长度为——32766个UTF-8类型的字符,可以通过设置ignore_above指定自持字符长度,超过给定长度后的数据将不被索引,无法通过term精确匹配检索返回结果。
自定义高亮
<properties> <java.version>1.8</java.version> <!-- 自定义ES依赖,保证版本一致 --> <elasticsearch.version>7.6.2</elasticsearch.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build>
@Configuration
public class ElasticSearchConfig {
// 注册 rest高级客户端
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("127.0.0.1",9200,"http")
)
);
return client;
}
}
测试方法较多,直接上示例链接
链接:https://pan.baidu.com/s/1WHmP73Ulmk4H2njzQRLM8A
提取码:ouz6
引入以上依赖,再引入fastjson
,定义本地ES的版本
<!-- 自定义ES依赖,保证版本一致 -->
<elasticsearch.version>7.6.2</elasticsearch.version>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
爬数据用来测试ES的效果
<!-- 解析网页 -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
测试是否正常获取
//请求地址https://search.jd.com/Search?keyword=java String url="https://search.jd.com/Search?keyword=java"; //解析网页,返回值就是浏览器Document页面对象 Document document = Jsoup.parse(new URL(url), 30000); // js的方法这里一样可以使用 Element element = document.getElementById("J_goodsList"); // 获取所有li元素 Elements elements = element.getElementsByTag("li"); for (Element e:elements){ //有些网站的图片没显示,是因为延迟加载的,或者查看有没有其它属性 String img=e.getElementsByTag("img").eq(0).attr("data-lazy-img"); String price=e.getElementsByClass("p-price").eq(0).text(); String title=e.getElementsByClass("p-name").eq(0).text(); System.out.println("----------------------------------------------------"); System.out.println(img); System.out.println(price); System.out.println(title); }
如果中文不能搜,是因为字符转义的问题,不用纠结,这里主要是查数据,做ES测试,主题不是爬数据,不能搜中文就搜英文的,有数据就行
import com.wzw.esjd.pojo.Content; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.springframework.stereotype.Component; import java.net.URL; import java.util.ArrayList; import java.util.List; @Component public class HtmlParseUtil { //测试工具类 public static void main(String[] args) throws Exception { //传入查询关键字 new HtmlParseUtil().parseJD("java").forEach(System.out::println); } /** * * @param keyword 查询关键字 * @return * @throws Exception */ public List<Content> parseJD(String keyword) throws Exception { String url="https://search.jd.com/Search?keyword="+keyword; Document document = Jsoup.parse(new URL(url), 30000); Element element = document.getElementById("J_goodsList"); Elements elements = element.getElementsByTag("li"); List<Content> contents=new ArrayList<>(); for (Element e:elements){ String img=e.getElementsByTag("img").eq(0).attr("data-lazy-img"); String price=e.getElementsByClass("p-price").eq(0).text(); String title=e.getElementsByClass("p-name").eq(0).text(); Content content=new Content(); content.setTitle(title); content.setImg(img); content.setPrice(price); contents.add(content); } return contents; } }
具体的测试代码和前后端,示例中查看
示例代码
链接:https://pan.baidu.com/s/1NzEvOwjjDrAiP0QIWi3vIg
提取码:8hkb
资源来源:https://www.bilibili.com/video/BV17a4y1x7zq?p=20&spm_id_from=333.880.my_history.page.click
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。