介紹
今天記錄一下Lucene的搜索過程胆数,基于自己的理解吧。
概要
- 獲取詞典及詞典的文檔號倒排表
- 解析Query語句互墓,轉為一棵Query查詢樹
- 根據(jù)Query構建Weight必尼,用于計算查詢權重并構建查詢評分器,主要調(diào)用IndexSearcher.createWeight()篡撵,實際是由Query.createWeight()生成判莉,在不需要評分或在緩存的時候齿诞,會添加到緩存。
- 構建Scorer骂租,用于對文檔集進行評分祷杈,主要調(diào)用weight.bulkScorer(ctx);
- 對文檔進行評分 主要調(diào)用 scorer.score(leafCollector, ctx.reader().getLiveDocs());
- 結果集在Collector中,最終返回結果
記錄
- 自己寫的新的Query需要重寫createWeight()渗饮,以便生成相應的Weight
- Weight中需要重寫scorer()等重要的方法但汞,用于進行評分
- scorer主要重寫 matches()和matchCost()
總的來說Lucene以及幫我們做了大部分工作,根據(jù)自己的需要就可以自定義一些查詢互站。比如Elasticsearch的ScriptQuery就是重寫了一個createWeight()私蕾,scorer()方法返回了一個ConstantScoreWeight。