從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
相關文章
相關標籤/搜索