从Lucene到Elasticsearch:Lucene 开发入门

https://gitee.com/jly521/lucene-demo.git

Lucene :开源的全文检索引擎工具包

  • 优点::
    • d91a74a079be468a43d66dfa3f806328716.jpg
  • Lucene 架构图::

9aeeb1dd61a3fa4d4561406d4cc80470100.jpg

检索分4步::

  1. 查询分析
    • 搜索通常全开放
    • 纠错
  2. 分词技术
  3. 关键词检索
  4. 搜索排序

Luck 是Lucene、Solr、ES 索引查看的 GUI 工具

  • 主要功能:
    • 7bef90733dca1be1f33df894eea1a228ad6.jpg

IK 分词器

  • 开源的、基于java的中文分词工具包

Lucene 分词详解:

  • 创建索引 和搜索的时候 要使用同一个分词器
  • Lucene 自带的中文分词器IKAnalyzer 和 SmartChineseAnalyzer 

IK 分词器

  • 比SmartChineseAnalyzer 精准些
  • 扩展停用词配置
    • 8ccb232ebb5fe99cd3bcb0a9344a3027bc1.jpg

Lucene索引详解::

  • 文档索引的基本单位,比文档更小的单位是字段
    • 字段组成:name、type、value(取值)

008e56b29208d6e76589430c701d6407cd8.jpg

66b969133f8c8a43481b53d82237de23ed5.jpg

a7df743c50eb601862737e3bdb4f9090b1c.jpg

  • 倒排索引在进行排序时:
    • 会访问所有文档集合中的排序字段
      • 再构建一个排序好的文档集合
    • 全部在内存中进行,
      • 很容易内存溢出和性能缓慢
    • 基于此,出现了DocValues 这一新特性
      • 在构建索引时,对开启docValues的字段
        • 额外构建一个已经排好序的文档到字段级别的列式存储映射
        • 减轻了排序分组对内存的依赖,大大提升了该过程性能
IndexWriterConfig config = new IndexWriterConfig(analyzer);

//每次会清空原有索引
config.setOpenMode(IndexWriterConfig.OpenMode.CREATE);

//没有则创建或有的就追加
//config.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
  • 索引的时候,FiledType 会设置 setIndexOptions 
    • 设定域的索引选项

0099659fc883b420467cb81b265f250afc0.jpg

  • 全文检索,关键词高亮
    • 在索引的时候,FiledType 提供方法设置 相对增量和位移信息
    • 75b28e5ce4492d03df1e3754bcfb38d8531.jpg

Luck 中查看索引

  • 下载对应版本,是一个jar 包,
  • 点击 luke.bat 
    • f75d30c0f668786aaea0735d1514a045cb2.jpg

Lucene 查询详解

  • 搜索入门
    • QueryParser parser = new QueryParser(field, analyzer);
      parser.setDefaultOperator(Operator.AND);
      // 查询语句
      Query query = parser.parse("农村学生");
  • 多域搜索
    • String[] fields = { "title", "content" };
      ...
      MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, analyzer);
      Query multiFieldQuery = parser.parse("日本");
  • 词项搜索
    • Term term = new Term("title", "美国");
      Query termQuery = new TermQuery(term);
  • 布尔搜索
    • BooleanQuery boolQuery=new BooleanQuery.Builder().add(bc1).add(bc2).build();
      • 默认是1024个 子查询,可以自定义设置
  • 范围搜索
    • IndexSearcher searcher = new IndexSearcher(reader);
      
      Query rangeQuery=IntPoint.newRangeQuery("reply",500,1000);
  • 前缀检索
    • Term term = new Term("title", "学");
      Query prefixQuery = new PrefixQuery(term);
  • 多关键字检索
    • 支持短语查询
      • PhraseQuery.Builder builder = new PhraseQuery.Builder();
        builder.add(new Term("title", "美国"),2);
        builder.add(new Term("title", "总统"),3);
        PhraseQuery phraseQuery = builder.build();
        •  
  • 模糊查询
    • 拼错单词搜对结果
    • Term term = new Term("title", "Trmp");
      FuzzyQuery fuzzyQuery = new FuzzyQuery(term);
      • 编辑距离算法:
        • 就是从一个字符串转换成另一个字符串,需要插入、删除、替换的字母个数
  • 通配符搜索
    • Term term = new Term("content", "学*");
      Query wildcardQuery = new WildcardQuery(term);
      • 可能会影响查询性能:
        • 通配符前较长的前缀能减少匹配次数
        • 第一个字符是通配符的话,请转换成枚举个数的第一个字符的查询

Lucene 高亮

  • 参见代码

Lucene 新闻高频词提取

  • IndexDocs
  • GetTopTerms

转载于:https://my.oschina.net/u/3847203/blog/2996605

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值