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. 获取原始文档
  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();
    }

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);

ELK-全文检索技术-lucene的更多相关文章

  1. 全文检索技术---Lucene

    1       Lucene介绍 1.1   什么是Lucene Lucene是apache下的一个开源的全文检索引擎工具包.它为软件开发人员提供一个简单易用的工具包(类库),以方便的在目标系统中实现 ...

  2. (转)全文检索技术学习(一)——Lucene的介绍

    http://blog.csdn.net/yerenyuan_pku/article/details/72582979 本文我将为大家讲解全文检索技术——Lucene,现在这个技术用到的比较多,我觉得 ...

  3. Lucene全文检索技术

    Lucene全文检索技术 今日大纲 ●    搜索的概念.搜索引擎原理.倒排索引 ●    全文索引的概念 ●    使用Lucene对索引进行CRUD操作 ●    Lucene常用API详解 ●  ...

  4. Lucene全文检索技术学习

    ---------------------------------------------------------------------------------------------------- ...

  5. JAVAEE——Lucene基础:什么是全文检索、Lucene实现全文检索的流程、配置开发环境、索引库创建与管理

    1. 学习计划 第一天:Lucene的基础知识 1.案例分析:什么是全文检索,如何实现全文检索 2.Lucene实现全文检索的流程 a) 创建索引 b) 查询索引 3.配置开发环境 4.创建索引库 5 ...

  6. 全文搜索技术—Lucene

    1.   内容安排 实现一个文件的搜索功能,通过关键字搜索文件,凡是文件名或文件内容包括关键字的文件都需要找出来.还可以根据中文词语进程查询,并且支持多种条件查询. 本案例中的原始内容就是磁盘上的文件 ...

  7. 全文检索(Lucene&Solr)

    全文检索(Lucene&Solr) 1)什么是全文检索?为什么需要全文检索? 结构化数据(mysql等)方便查询,而非结构化数据(如多篇文章)是难以查询到自己需要的,所以要使用全文检索. 全文 ...

  8. 全文检索框架---Lucene

    一.什么是全文检索 1.数据分类 我们生活中的数据总体分为两种:结构化数据和非结构化数据.   结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等.   非结构化数据:指不定长或无固定格式 ...

  9. (转)全文检索技术学习(二)——配置Lucene的开发环境

    http://blog.csdn.net/yerenyuan_pku/article/details/72589380 Lucene下载 Lucene是开发全文检索功能的工具包,可从官方网站http: ...

随机推荐

  1. 并发量,tps,qps

    QPS/TPS/并发量/系统吞吐量的概念 2017年08月13日 17:24:47 阅读数:10682 我们在日常工作中经常会听到QPS/TPS这些名词,也会经常被别人问起说你的系统吞吐量有多大.这个 ...

  2. maven国内镜像、国内外仓库(直接下载jar)

    阿里: https://maven.aliyun.com/mvn/search 官方: http://repo.maven.apache.org/maven2/ maven仓库 阿里巴巴的镜像仓库, ...

  3. android 模糊背景 异型背景

    模糊算法参考: http://blog.csdn.net/markl22222/article/details/10313565 网上很多,这东西是个概念理解,没有什么新鲜的. 轮子有现成的,模糊算法 ...

  4. linux (一)

    一.文件目录 cd 目录进出 pwd 查看路径 ls:ll 查看目录 mkdir : mkdir -p  app/test 创建目录 touch 创建文件 rm :rm -r 递归 -f 强制 mv ...

  5. 菲律宾薄荷岛游记 & 攻略

    2019年的4月跑去薄荷岛玩了!其实是一个比较小众的海岛,感觉那边还是比较穷的,但是景色真的好好啊!而且我们两个人,最后包括前期买水母服.浮潜面罩.防晒霜什么的,总共花费才人均5000+,非常划算了! ...

  6. spring/boot 打包,资源/配置/业务文件分离

    spring/boot打包,将业务jar包和资源配置文件进行分离打包,打包后的资源在target/release文件夹下面 注意:添加以下配置后,注意修改自己的入口类 <!--相关编译打包依赖- ...

  7. 微信小程序UI学习

    1.大纲: 2.flex的布局: 3.相对定位和绝对定位: position: relative   相对定位 position: absolute  绝对定位

  8. Professional JavaScript for Web Developers P224-P225

    然后第二段代码执行过程中,有1个global variabe object,1个createFunction activation object,10个anonymous function1 acti ...

  9. Stream parallel并行流的思考

    1.并行流并不一定能提高效率,就和多线程并不能提高线程的效率一样 因为引入并行流会引起额外的开销,就像线程的频繁上下文切换会导致额外的性能开销一样,当数据在多个cpu中的处理时间小于内核之间的传输时间 ...

  10. golang基础学习-MongoDB使用

    1.系统环境 Golang:go version go1.10.3 darwin/amd64 OS:MacOS MongoDB: version: 3.4.4 2.Golang使用MongoDB 使用 ...