从Lucene到Elasticsearch:Lucene 开发入门

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

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

  • 优势::
  • Lucene 架构图::

检索分4步::算法

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

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

  • 主要功能:

IK 分词器工具

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

Lucene 分词详解:性能

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

IK 分词器ui

  • 比SmartChineseAnalyzer 精准些
  • 扩展停用词配置

Lucene索引详解::3d

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

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

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

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

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

Luck 中查看索引code

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

Lucene 查询详解blog

  • 搜索入门
    • 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
相关文章
相关标签/搜索