ELK : ELK是ElasticSearch,LogStash以及Kibana三个产品的首字母缩写
一.倒排索引
学习elk,必须先掌握倒排索引思想,

参考文档: https://www.cnblogs.com/zlslch/p/6440114.html
二.什么是全文检索?
诸如传统的正序查询(数据库查询),如果用到京东或淘宝上,用户输入关键字进行查询,无论是标题还是描述只要有关键字就会被查到,很伤!倒排索引能很好的实现电商搜索功能
结构化数据:有固定格式和有限长度 比如 关系型数据库中的数据
查询的方式:sql
如果数据量特别大时:可以使用全文检索技术
非结构化数据:没有固定格式和没有规定长度 比如电脑上的文档 txt word
查询的方式:肉眼查找
如果数据量特别大时:可以使用全文检索技术
三.什么是全文检索技术
3.1全文检索技术:
这种先建立索引,再对索引进行搜索的过程就叫做全文检索
3.2 那些场景用到全文检索技术?
1、搜索引擎 谷歌 百度 360 搜狗 搜搜
2、站内搜索 京东 天猫 微博 天涯 猫扑
3、垂直搜索 视频网站的搜索 优酷,( 在优酷可以搜索到其他视频网站的视频)
四.引入lucene
lucene可以实现全文检索,
Lucene是Apache提供用来实现全文检索的一套类库 jar
五.lucene的使用
5.1需要的坐标
第一步:导入jar
必须的包:lucene-core-4.10.3.jar
lucene-analyzers-common-4.10.3.jar 分词器
commons-io.jar
junit.jar
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>4.10.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
|
5.2创建索引
- 获取原始文档
- 构建索引文档对象
- 分析文档(分词)
- 创建索引
具体代码示例:
/***
* //查询索引分析
// 1.创建一个Directory对象,也就是索引库存放的位置
// 2. 创建一个indexReader对象,需要制定Directory对象
// 3. 创建一个indexSearcher对象,需要指定indexReader对象
// 4. 创建一个TremQuery对象,制定查询的域和查询的关键字
// 5. 执行查询
// 6. 返回查询结果,遍历查询结果并输出
// 7. 关闭indexReader对象
*/
public static void selectIndex(String keywords) throws IOException {
//查询索引分析
// 1.创建一个Directory对象,也就是索引库存放的位置
Directory directory=FSDirectory.open(new File("D:\\Documents\\Downloads\\day02_lucene\\索引存放位置"));
// 2. 创建一个indexReader对象,需要指定Directory对象
IndexReader indexReader=
DirectoryReader.open(directory);
// 3. 创建一个indexSearcher对象,需要指定indexReader对象
IndexSearcher indexSearcher=new IndexSearcher(indexReader);
// 4. 创建一个TremQuery对象,制定查询的域和查询的关键字
Query termQuery=new TermQuery(new Term("filename",keywords));
// 5. 执行查询
TopDocs search =
indexSearcher.search(termQuery, 10);
// 6. 返回查询结果,遍历查询结果并输出
//查询结果的总条数
System.out.println("查询结果的总条数"+search.totalHits);
//遍历查询结果
for (ScoreDoc scoreDoc : search.scoreDocs) {
//scoreDoc.doc就是document的id
Document
document=indexSearcher.doc(scoreDoc.doc);
//通过document对象展示出所有结果信息
System.out.println("filename="+document.get("filename"));
System.out.println("filepath="+document.get("filepath"));
System.out.println("filesize="+document.get("filesize"));
//
System.out.println("filecontent="+document.get("filecontent"));
//来一个分割符
System.out.println("=================================================");
}
// 7. 关闭indexReader对象
indexReader.close();
}
|
5.3 查询索引
1. 创建用户查询接口,提供一个输入关键字的地方
2. 创建查询
3. 执行查询
4. 渲染结果
具体代码示例:
/***
* //查询索引分析
// 1.创建一个Directory对象,也就是索引库存放的位置
// 2. 创建一个indexReader对象,需要制定Directory对象
// 3. 创建一个indexSearcher对象,需要指定indexReader对象
// 4. 创建一个TremQuery对象,制定查询的域和查询的关键字
// 5. 执行查询
// 6. 返回查询结果,遍历查询结果并输出
// 7. 关闭indexReader对象
*/
public static void selectIndex(String keywords) throws IOException {
//查询索引分析
// 1.创建一个Directory对象,也就是索引库存放的位置
Directory directory=FSDirectory.open(new File("D:\\Documents\\Downloads\\day02_lucene\\索引存放位置"));
// 2. 创建一个indexReader对象,需要指定Directory对象
IndexReader indexReader=
DirectoryReader.open(directory);
// 3. 创建一个indexSearcher对象,需要指定indexReader对象
IndexSearcher indexSearcher=new IndexSearcher(indexReader);
// 4. 创建一个TremQuery对象,制定查询的域和查询的关键字
Query
termQuery=new TermQuery(new Term("filename",keywords));
// 5. 执行查询
TopDocs search =
indexSearcher.search(termQuery, 10);
// 6. 返回查询结果,遍历查询结果并输出
//查询结果的总条数
System.out.println("查询结果的总条数"+search.totalHits);
//遍历查询结果
for (ScoreDoc scoreDoc : search.scoreDocs) {
//scoreDoc.doc就是document的id
Document
document=indexSearcher.doc(scoreDoc.doc);
//通过document对象展示出所有结果信息
System.out.println("filename="+document.get("filename"));
System.out.println("filepath="+document.get("filepath"));
System.out.println("filesize="+document.get("filesize"));
//
System.out.println("filecontent="+document.get("filecontent"));
//来一个分割符
System.out.println("=================================================");
}
// 7. 关闭indexReader对象
indexReader.close();
}
|
六.分词器
如果检索的是英文,分词器使用标准的就可以,但是外国人编写的中文分词器总是不成功,
这里使用IK-analyzer
StandardAnalyzer:一个字一个字的
CJKAnalyzer:两个字两个字 需要添加
lucene-analyzers-smartcn依赖
SmartChineseAnalyzer:对中文的支持还算可以,但是英文有缺失字母的情况
第三方分词器:IK-analyzer
依赖是:
<dependency>
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
<version>2012_u6</version>
<exclusions>
<exclusion>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
</exclusion>
</exclusions>
</dependency>
|
需要三个配置文件
IKAnalyzer.cfg.xml 核心配置文件
ext.dic 扩展词典
stopword.dic 停用词典
七. 使用分词器进行查询
- public static void selectIndex(String keywords) throws IOException, ParseException {
- //查询索引分析
- // 1.创建一个Directory对象,也就是索引库存放的位置
- Directory directory=FSDirectory.open(new File("D:\\Documents\\Downloads\\day02_lucene\\索引存放位置"));
- // 2. 创建一个indexReader对象,需要指定Directory对象
- IndexReader indexReader= DirectoryReader.open(directory);
- // 3. 创建一个indexSearcher对象,需要指定indexReader对象
- IndexSearcher indexSearcher=new IndexSearcher(indexReader);
- // 4. 创建一个TremQuery对象,制定查询的域和查询的关键字
- //创建一个分词器
- Analyzer analyzer=new IKAnalyzer();
- //几种查询
- //精确查询
- // Query termQuery=new TermQuery(new Term("filename",keywords));
- // //通配符查询,只要包含关键字都可以
- // Query termQuery=new WildcardQuery(new Term("filename","*"+keywords+"*"));
- // //模糊查询,容错性高
- // Query termQuery=new FuzzyQuery(new Term("filename",keywords));
- /* //通配符查询,只要包含关键字都可以
- Query termQuery1=new WildcardQuery(new Term("filename","*"+keywords+"*"));
- //模糊查询,容错性高
- Query termQuery2=new FuzzyQuery(new Term("filename",keywords));
- //BooleanQuery 查询,可以查询多个条件
- BooleanQuery termQuery=new BooleanQuery();
- termQuery.add(termQuery1, BooleanClause.Occur.MUST);//must表示必须满足
- termQuery.add(termQuery2, BooleanClause.Occur.SHOULD);//其他条件查询完,如果满足本条件,则添加
- //must_not 表示必须不满足才执行*/
- //分词查询
- //1. 一个域的查询,如上
- //2. 多个域的查询
- QueryParser queryParser=new MultiFieldQueryParser(new String[]{"filename","filecontent"},analyzer);
- Query termQuery=queryParser.parse(keywords);
-
-
-
- // 5. 执行查询
- TopDocs search = indexSearcher.search(termQuery, 10);
- // 6. 返回查询结果,遍历查询结果并输出
- //查询结果的总条数
- System.out.println("查询结果的总条数"+search.totalHits);
- //遍历查询结果
- for (ScoreDoc scoreDoc : search.scoreDocs) {
- //scoreDoc.doc就是document的id
- Document document=indexSearcher.doc(scoreDoc.doc);
-
- //通过document对象展示出所有结果信息
- System.out.println("filename="+document.get("filename"));
- System.out.println("filepath="+document.get("filepath"));
- System.out.println("filesize="+document.get("filesize"));
- // System.out.println("filecontent="+document.get("filecontent"));
- //来一个分割符
- System.out.println("=================================================");
- }
-
- // 7. 关闭indexReader对象
- indexReader.close();
- }
|
八. 打分
关键字占的比重及权重
举例说明
关键字占的比例即权重
spring.txt 分词后的结果:spring txt 50%
spring_README.txt 分词后的结果:spring README txt 33%
spring的简介.txt 分词后的结果:spring 简介 简 介 txt 20%
spring是个非常流行的框架.txt
spring是个开发中非常流行的框架.txt
问题
为什么百度搜索时权重较低的广告可以排在最前面?
设置权重
可以设置boost值 默认是1.0
在添加索引的时候设置权重
- Field fileContentField=new TextField("filecontent",fileContent,Field.Store.YES);
- //权重默认是1.0,越大权重越高
- fileContentField.setBoost(1.5f);
- Field filePathField=new StringField("filepath",filePath,Field.Store.YES);
- Field fileNameField=new TextField("fileName",fileName,Field.Store.YES);
- Field filesizeField=new LongField("filesize",fileSize,Field.Store.YES);
|
- 全文检索技术---Lucene
1 Lucene介绍 1.1 什么是Lucene Lucene是apache下的一个开源的全文检索引擎工具包.它为软件开发人员提供一个简单易用的工具包(类库),以方便的在目标系统中实现 ...
- (转)全文检索技术学习(一)——Lucene的介绍
http://blog.csdn.net/yerenyuan_pku/article/details/72582979 本文我将为大家讲解全文检索技术——Lucene,现在这个技术用到的比较多,我觉得 ...
- Lucene全文检索技术
Lucene全文检索技术 今日大纲 ● 搜索的概念.搜索引擎原理.倒排索引 ● 全文索引的概念 ● 使用Lucene对索引进行CRUD操作 ● Lucene常用API详解 ● ...
- Lucene全文检索技术学习
---------------------------------------------------------------------------------------------------- ...
- JAVAEE——Lucene基础:什么是全文检索、Lucene实现全文检索的流程、配置开发环境、索引库创建与管理
1. 学习计划 第一天:Lucene的基础知识 1.案例分析:什么是全文检索,如何实现全文检索 2.Lucene实现全文检索的流程 a) 创建索引 b) 查询索引 3.配置开发环境 4.创建索引库 5 ...
- 全文搜索技术—Lucene
1. 内容安排 实现一个文件的搜索功能,通过关键字搜索文件,凡是文件名或文件内容包括关键字的文件都需要找出来.还可以根据中文词语进程查询,并且支持多种条件查询. 本案例中的原始内容就是磁盘上的文件 ...
- 全文检索(Lucene&Solr)
全文检索(Lucene&Solr) 1)什么是全文检索?为什么需要全文检索? 结构化数据(mysql等)方便查询,而非结构化数据(如多篇文章)是难以查询到自己需要的,所以要使用全文检索. 全文 ...
- 全文检索框架---Lucene
一.什么是全文检索 1.数据分类 我们生活中的数据总体分为两种:结构化数据和非结构化数据. 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等. 非结构化数据:指不定长或无固定格式 ...
- (转)全文检索技术学习(二)——配置Lucene的开发环境
http://blog.csdn.net/yerenyuan_pku/article/details/72589380 Lucene下载 Lucene是开发全文检索功能的工具包,可从官方网站http: ...
随机推荐
- Android学习_7/22
一.Android项目目录结构 1. AndroidManifest.xml:整个Android项目的配置,注册各组件 <activity android:name=" ...
- 「WC 2007」剪刀石头布
题目链接 戳我 \(Solution\) 直接求很明显不太好求,于是考虑不构成剪刀石头布的情况. 我们现在假设一个人\(i\)赢了\(x\)场,那么就会有\(\frac{x*(x-1)}{2}\) 我 ...
- RedisTemplate中zset类型的使用
简述 上一文中简述了使用StringRedisTemplate操作redis中的set类型,今天来记录一下操作zset类型的主要方法 代码 @RunWith(SpringRunner.class) @ ...
- 使用 vuetron 调试 mpvue 项目
简介 由于小程序开发工具的封闭,我们无法通过安装 chrome 插件来方便地使用 vue-devtools 调试我们的 mpvue 项目.vuetron 是一个 vue.js 的项目调试工具, 同时支 ...
- C++入门经典-例6.5-连接字符串
1:运行代码如下: // 6.5.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> usin ...
- SSM三大框架整合配置详解
首先,导入框架所需要的全部jar包(此处省略...........) 第一步:先从mybatis框架开始 我们只需要在mybatis的核心配置文件sqlConfigXml里写上这么一段话,代表的是给p ...
- linux如何杀掉进程(kill)
方法/步骤1: 使用“ps -e|grep mysql”命令,查看mysql程序的对应的pid号.结果如下图: 方法/步骤2: 使用“kill -9 2891”命令,可以结束掉mysqld_saf ...
- redhat下配置SEED DVS6446开发环境3
1.运行arm_v5t_le-gcc,报错为: 64bit的Linux操作系统,无法运行32bit的应用程序 /lib/ld-linux.so.2: bad ELF interpreter: No s ...
- Python_编程特色
目录 目录 前言 软件环境 列表推导式 字典的默认值 forelse语句 交换两个变量的值 链式比较 真值测试 序列类型元素反转 连接字符串和列表 内置算术函数 利用zip来创建键值对 最后 前言 P ...
- Selenium 2自动化测试实战10(鼠标事件)
一.鼠标事件 1. webdriver中,关于鼠标操作的方法封装在ActionChains类中 ActionChains类提供了鼠标操作的常用方法: perform:执行所有ActionChains中 ...