• Lucene总结


    数据的分类

    结构化数据:有固定类型或者有固定长度的数据

    例如:数据库中的数据(mysql,oracle), 元数据(就是windows中的数据)

    结构化数据搜索方法:

    数据库中数据通过sql语句可以搜索

    元数据(windows中的)通过windows提供的搜索栏进行搜索

    非结构化数据:没有固定类型和固定长度的数据

    例如: Word文档中的数据, 邮件中的数据

    非结构化数据搜索方法:

    Word文档使用ctrl+F来搜索

    顺序扫描法:

    Ctrl+F中是使用的顺序扫描法,拿到搜索的关键字,去文档中,逐字匹配,直到找到和关键字一致的内容为止.

    优点: 如果文档中存在要找的关键字就一定能找到想要的内容

    缺点: , 效率低

    全文检索算法(倒排索引算法):

    将文件中的内容提取出来, 将文字拆封成一个一个的词(分词), 将这些词组成索引(字典中的目录), 搜索的时候先搜索索引,通过索引找文档,这个过程就叫做全文检索.

     

    分词: 去掉停用词(a, an, the ,, , , , ),因为搜索的时候搜索这些词没有意义,将句子拆分成词,去掉标点符号和空格

    优点: 搜索速度快

    缺点: 因为创建的索引需要占用磁盘空间,所以这个算法会使用掉更多的磁盘空间,这是用空间换时间

    原理

    相当于字典,分为目录和正文两部分,查询的时候通过先查目录,然后通过目录上标注的页数去正文页查找需要的内容

    Lucene

    什么是lucene

    Luceneapache旗下的顶级项目,是一个全文检索工具包

    Lucene就是一个可以创建全文检索引擎系统的一堆jar.可以使用它来构建全文检索引擎系统,但是它不能独立运

    全文检索引擎系统

    放在tomcat下可以独立运行,对外提供全文检索服务.

     

    Lucene应用领域

    1. 互联网全文检索引擎(比如百度,  谷歌,  必应)
    2. 站内全文检索引擎(淘宝, 京东搜索功能)
    3. 优化数据库查询(因为数据库中使用like关键字是全表扫描也就是顺序扫描算法,查询慢)

     

    Lucene下载

    官方网站:http://lucene.apache.org/ 

    版本:lucene4.10.3

    Jdk要求:1.7以上

    IDEEclipse

    Lucene结构

     

    索引:

    域名:词  这样的形式,

    它里面有指针指向这个词来源的文档

     

    索引库: 放索引的文件夹(这个文件夹可以自己随意创建,在里面放索引就是索引库)

    Term词元: 就是一个词, lucene中词的最小单位

    文档:

    Document对象,一个Document中可以有多个Field域对象,Field域对象中是key   value键值对的形式:有域名和域值,

    一个document就是数据库表中的一行记录, 一个Filed域对象就是数据库表中的一行一列

    这是一个通用的存储结构.

     

    创建索引和搜索时所用的分词器必须一致(才能匹配)

    域的详细介绍

    是否分词:

    分词的作用是为了索引

    需要分词: 文件名称, 文件内容

    不需要分词: 不需要索引的域不需要分词,还有就是分词后无意义的域不需要分词

      比如: id, 身份证号

     

    是否索引:

    索引的的目的是为了搜索.

    需要搜索的域就一定要创建索引,只有创建了索引才能被搜索出来

    不需要搜索的域可以不创建索引

    需要索引: 文件名称, 文件内容, id, 身份证号等

    不需要索引: 比如图片地址不需要创建索引, e:\xxx.jpg

    因为根据图片地址搜索无意义

     

    是否存储:

    存储的目的是为了显示.

    是否存储看个人需要,存储就是将内容放入Document文档对象中保存出来,会额外占用磁盘空间, 如果搜索的时候需要马上显示出来可以放入document中也就是要存储,这样查询显示速度快, 如果不是马上立刻需要显示出来,则不需要存储,因为额外占用磁盘空间不划算.

    域的各种类型

     

    Field

    数据类型

    Analyzed

    是否分析

    Indexed

    是否索引

    Stored

    是否存储

    说明

    StringField(FieldName, FieldValue,Store.YES))

    字符串

    N

    Y

    Y或N

    这个Field用来构建一个字符串Field,但是不会进行分析,会将整个串存储在索引中,比如(订单号,姓名等)

    是否存储在文档中用Store.YESStore.NO决定

    LongField(FieldName, FieldValue,Store.YES)

    Long

    Y

    Y

    Y或N

    这个Field用来构建一个Long数字型Field,进行分析和索引,比如(价格)

    是否存储在文档中用Store.YESStore.NO决定

    StoredField(FieldName, FieldValue) 

    重载方法,支持多种类型

    N

    N

    Y

    这个Field用来构建不同类型Field

    不分析,不索引,但要Field存储在文档中

    TextField(FieldName, FieldValue, Store.NO)

    TextField(FieldName, reader)

     

    字符串

    Y

    Y

    Y或N

    如果是一个Reader, lucene猜测内容比较多,会采用Unstored的策略.

     

    注意:lucene底层的算法,钱数是要分词的,因为要根据价钱进行对比

    例如: 大于12.5元的小于100元的商品搜索出来

    文档的更新

    更新就是按照传入的Term进行搜索,如果找到结果那么删除,将更新的内容重新生成一个Document对象

    如果没有搜索到结果,那么将更新的内容直接添加一个新的Document对象

     

    文档的删除

    可以根据某个域的内容进行删除

    还可以一次删除所有

     

    搜索

    TermQuery:

    根据词进行搜索(只能从文本中进行搜索)

    QueryParser:

    根据域名进行搜索,可以设置默认搜索域,推荐使用. (只能从文本中进行搜索)

    NumericRangeQuery:

    从数值范围进行搜索

    BooleanQuery:

    组合查询,可以设置组合条件,not and or.从多个域中进行查询

    must相当于and关键字,是并且的意思

    should,相当于or关键字或者的意思

    must_not相当于not关键字, 非的意思

    注意:单独使用must_not  或者 独自使用must_not没有任何意义

    MatchAllDocsQuery:

    查询出所有文档

    MultiFieldQueryParser:

    可以从多个域中进行查询,只有这些域中有关键词的存在就查询出来.

  • 相关阅读:
    为用户添加角色
    WCF、MongoDB
    文件分布式存储实现例程
    Redis的Replication(复制)
    Lucene热词显示并选择
    Lucene热词统计
    通过队列解决Lucene文件并发创建索引
    Lucene.net应用
    Lucene.net
    Redis
  • 原文地址:https://www.cnblogs.com/wyb628/p/6869874.html
Copyright © 2020-2023  润新知