- 自己動手寫分布式搜索引擎
- 羅剛
- 526字
- 2020-11-28 15:52:49
3.3.6 短語查詢
如果按字索引中文文檔,則查詢的時候往往要求文檔中的這些字是連續(xù)出現(xiàn)的。使用PhraseQuery可以查詢連續(xù)出現(xiàn)的幾個關(guān)鍵詞。PhraseQuery稱為短語匹配查詢,用于要求精確匹配的查詢。PhraseQuery使用了詞保存在索引中的位置信息,因此需要索引中的相關(guān)列已經(jīng)保存了位置信息。例如按字索引,按字查詢“開封”:
PhraseQuery query = new PhraseQuery(); query.add(new Term("subject", "開")); query.add(new Term("subject", "封"));
搜索“軟件工程師”時,標(biāo)題為“安卓軟件開發(fā)工程師”排第一位,而標(biāo)題為“軟件工程師”反而排在后面。詞庫為:“軟件”“工程師”。為了解決這個問題,可以增加短語查詢:
PhraseQuery query = new PhraseQuery(); query.add(new Term("subject", "軟件")); query.add(new Term("subject", "工程師"));
有時候要匹配上的詞之間有間隔,匹配上的詞之間的距離稱為slop。默認(rèn)情況下,slop的值是0,可以通過調(diào)用setSlop()方法設(shè)置這個值。例如,用戶搜索“西紅柿牛腩”時,會匹配上“西紅柿燉牛腩”。
PhraseQuery query = new PhraseQuery(); query.setSlop(1); query.add(new Term("subject", "西紅柿")); query.add(new Term("subject", "牛腩"));
使用PhraseQuery完整的例子:
public static void main(String[] args) throws Exception { //在內(nèi)存中建立索引 Directory directory = new RAMDirectory(); Analyzer analyzer = new StandardAnalyzer(); IndexWriterConfig iwc = new IndexWriterConfig(analyzer); IndexWriter writer = new IndexWriter(directory, iwc); // 索引一些文檔 writer.addDocument(createDocument("1", "foo bar baz")); writer.addDocument(createDocument("2", "red green blue")); writer.addDocument(createDocument("3", "test foo bar test")); writer.close(); // 查找包含foo bar這個短語的文檔 String sentence = "foo bar"; IndexReader reader = IndexReader.open(directory); // 根據(jù)IndexReader創(chuàng)建IndexSearcher IndexSearcher searcher = new IndexSearcher(reader); PhraseQuery query = new PhraseQuery(); String[] words = sentence.split(" "); for (String word : words) { query.add(new Term("contents", word)); } // 顯示搜索結(jié)果 TopDocs topDocs = searcher.search(query, 10); for (ScoreDoc scoreDoc : topDocs.scoreDocs) { Document doc = searcher.doc(scoreDoc.doc); System.out.println(doc); } } private static Document createDocument(String id, String content) { Document doc = new Document(); doc.add(new Field("id", id, Store.YES, Index.NOT_ANALYZED)); doc.add(new Field("contents", content, Store.YES, Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); return doc; }
推薦閱讀
- 數(shù)碼攝影后期零基礎(chǔ)入門教程
- 做合成:Photoshop構(gòu)圖+透視+紋理+造型+調(diào)色技術(shù)修煉
- Sencha Touch Cookbook, Second Edition
- Photoshop CS6完全自學(xué)案例教程(微課版)
- 3ds Max 2014從入門到精通
- CAD/CAM技術(shù)與應(yīng)用
- Moodle JavaScript Cookbook
- iPhone Applications Tune/Up
- Photoshop+Adobe Camera Raw+Lightroom(攝影后期照片潤飾實戰(zhàn))
- 3ds Max/MaxScript印象 腳本動畫制作基礎(chǔ)與應(yīng)用
- WordPress Theme Design
- Oracle Warehouse Builder 11g: Getting Started
- SolidWorks 2018快速入門及應(yīng)用技巧
- 中文版After Effects 2022基礎(chǔ)教程
- 學(xué)摳圖:Photoshop專業(yè)摳圖技法案例教程