zoukankan      html  css  js  c++  java
  • 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:

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

  • 相关阅读:
    什么是webview
    juqery.fn.extend和jquery.extend
    LeetCode
    5. Longest Palindromic Substring
    42. Trapping Rain Water
    11. Container With Most Water
    621. Task Scheduler
    49. Group Anagrams
    739. Daily Temperatures
    3. Longest Substring Without Repeating Characters
  • 原文地址:https://www.cnblogs.com/wyb628/p/6869874.html
Copyright © 2011-2022 走看看