1.聲明
當前內容主要用於本人學習和複習,當前內容爲使用和操作Luke軟件
2.查看Luke軟件的位置
打開它:
luke
3.使用Luke
1.選擇一個索引文件夾並打開
2.查看OverView界面
- 當前的文檔中具有Fields,(即寫入的字段)
- 字段中具有Term,並且這個Term是按照分析器進行分析的
3.查看當前的content的Term
可以發現當前由於我使用的是CJKAnaylzer分析器,所以產生的Term就是兩個中文成爲一個Term
(所以查詢的時候就是使用new QueryTerm(new Term)直接就命中了字段,所以這麼快
)
所以可以判定,使用不同的Anaylzer就會產生不同的Term,不同的Term那麼搜索方式也不同,當前就是將文本內容按照兩個文字進行分割成一個Term
4.查看Documents界面
當前的文檔中具有標記,通過選擇filed的名稱和Term方式進行搜索
顯示的數據中,具有字段,標記,Norm,以及value
5.查看search
通過分析發現當前默認使用的是:StandardQueryParser,並且使用的Query expression爲:*:*
,結果爲所有的文檔數據
所以本人分析是不是可以通過:*:*
方式實現查詢所有的數據的目的
查詢的文檔中具有score分數
6.查看Analysis
這裏測試發現使用StandardAnalyzer方式默認產生的Term就是單個單詞的字母全部小寫,所以不同的分析器產生的結果也不一樣
7.查看Commits
通過分析發現當前的segment文件其實就是一些所謂的系統的配置文件
8.查看logs
這裏主要就是一些日誌信息
4.分析發現
- 我們通過創建不同的Anaylzer分析器那麼那些被加入到Document中的Field中的所產生的Term就不同
- 我們的Document中包含多個Field,並且一個Field可以通過分析器產生多個Term
- 我們通過查詢的時候就是使用Term來實現查詢的(這就是爲什麼Lucene這麼快)
- Lucene沒有分頁操作,只能手動物理分頁
5.實現查詢全部的效果
直接使用*:*
來實現
public static ArrayList<Document> findAllDocuments2(String indexPath, String fieldName, int num)
throws IOException, ParseException, QueryNodeException {
return findDocumentsByQuery(indexPath, fieldName,"*:*", num);
}
public static ArrayList<Document> findDocumentsByQuery(String indexPath, String filedName, String experssion,
int num) throws IOException, ParseException, QueryNodeException {
try (Directory dir = FSDirectory.open(Paths.get(indexPath));
DirectoryReader directoryReader = DirectoryReader.open(dir);) {
IndexSearcher indexSearcher = new IndexSearcher(directoryReader);
StandardQueryParser parser = new StandardQueryParser(new StandardAnalyzer());
Query query = parser.parse(experssion, filedName);
// TotalHits totalHits = topDocs.totalHits;
ArrayList<Document> docs = search(indexSearcher, query, num);
return docs;
}
}
測試結果
成功查詢了數據,這說明當前的查詢全部可以使用:*:*
來實現,但是還是要指定查詢的字段
6.總結
1.通過分析當前的Luke的軟件,發現了當前的查詢的來源,以及實際上各種組件之間的使用
2.查詢實際就是根據Term進行匹配
以上純屬個人見解,如有問題請聯本人!