1. 程式人生 > >Lucene讀書筆記——5. 高階搜尋技術

Lucene讀書筆記——5. 高階搜尋技術

Lucene域快取 為所有文件載入域值 float[] weigths = FieldCache.DEFAULT.getFloats(reader, "weight"); weights[docid] = the value of weight field. 域快取只能包含單個項的域。這通常意味著該域在被索引時需要使用引數Index.NOT_ANALYZED 或 Index.NOT_ANALYZED_NO_NORMS,如果使用KeywordAnalyzer等分析器的話,這些域還是可以被分析的,該分析過程只產生一個語彙單元。 只有關閉reader並去掉引用後才會清楚快取中的資料記錄(以reader為主鍵的WeakHashMap時在後臺使用的) 段對應的reader
Lucene核心功能傳入域快取的reader引數將永遠為一個reader對應一個段 。當重新開啟一個IndexReader時,這個處理方式能帶來很大好處;只有新生成的段才必須載入至域快取。 對搜尋結果進行排序 根據域值進行排序 在預設情況下,接受Sort物件引數的search方法不會對匹配文件進行任何評分操作。因為評分操作會消耗大量的系統性能,並且很多程式在通過域排序時並不需要進行評分操作。如果你的應用程式並不需要評分操作,那麼最好時使用預設搜尋方法。當需要使用其他搜尋方法時,可以使用IndexSearcher類的setDefaultFieldSortScoring( )方法,該方法有2個布林型別引數:doTrackScores 和 doMaxScore doTrackScores置為true,那麼每個搜尋命中結果
都會被進行評分操作。 doMaxScore為true,那麼程式將對最大分值的搜尋命中結果進行評分操作。 Searcher searcher = new IndexSearcher(directory); searcher.setDefaultFieldSortScoring(true, false); TopDocs results = searcher.search(query, null, 20, sort); //sort傳進來 new Sort(new SortField("category", SortField.INT, true)) Sort.RELEVANCE       與 new Sort()等效 Sort.INDEXORDER    按照相關性進行排序
Sort.RELEVANCE       與 new Sort()等效 按照索引順序進行排序 Sort.INDEXORDER   通過域進行排序 new Sort(new SortField("category",  SortField.String, true)); //最後一個引數用來是否是reverse 倒排序 new Sort(new SortField("category",  SortField.String, true)); //最後一個引數用來是否是reverse 通過多個域進行排序 new Sort(new SortField("category", SortField.STRING), SortField.FIELD_SCORE, new SortField("pubmonth", SortField.INT, true)); 為排序域選擇型別 使用非預設的locale方式進行排序 public SortField(String field, Locale locale, boolean reverse);  使用MultiPhraseQuery 該類是一次指定多個Term對一個field進行查詢 MultiPhraseQuery query = new MultiPhraseQuery(); query. add(new Term[]{new Term("field", "quick"), new Term("field", "fast" )} );//一次指定2個 query.add( new Term( "field", "fox"));//再指定一個 針對多個域的一次性查詢 Query query = new MultiFieldQueryParser(Version.LUCENE_30, new String[]{"title" , "subject" }, new SimpleAnalyzer()).parse("development" ); 跨度查詢 跨度查詢是指域中的起始語彙單元和終止語彙單元的位置。 如使用   靠近“president obama”且包含“health care reform”這樣的搜尋條件 與TermQuery做個比較,TermQuery只是對文件進行簡單的匹配操作,而SpanTermQuery除了完成這個功能, 還會保留每個匹配文件對應的項位置資訊。 總的來說,跨度查詢是一種計算密集型操作。 TermQuery找到包含對應的文件時,它會記錄該匹配文件並且進行下一個文件的查詢操作;而SpanTermQuery卻必修列舉出該項在該文件中所有的出現地點。
SpanQuery型別 描   述
SpanTermQuery 和其他跨度查詢型別結合使用。單獨使用時相當於TermQuery
SpanFirstQuery 用來匹配各個域的首部分的各個跨度
SpanNearQuery 用來匹配臨近跨度
SpanNotQuery 用來匹配不重疊的跨度
FieldMaskingSpanQuery 封裝其他SpanQuery類,但程式會認為已匹配到另外的域。該功能可用於針對多個域的跨度查詢
SpanOrQuery 跨度查詢的聚合匹配
跨度查詢的構建模組:SpanTermQuery            SpanTermQuery query = new SpanTermQuery( new Term("field", "the" ));            IndexSearcher searcher = new IndexSearcher( new RAMDirectory());            IndexReader reader = searcher.getIndexReader();            Spans spans = query.getSpans( reader);            Analyzer analyzer = new WhitespaceAnalyzer(); while( spans.next()) { int id = spans.doc();                 Document doc = reader.document( id);                 TokenStream stream = analyzer.tokenStream( "contents", new StringReader(doc.get("f" )));                 TermAttribute term = stream.addAttribute(TermAttribute. class); int i = 0; while( stream.incrementToken()) { if( i == spans.start()) {                      } term.term(); if( i+1 == spans.end()) {                      }                 }            } 在域的起點查詢跨度 SpanFirstQuery sfq = new SpanFirstQuery(brown, 2); //從開始找2個跨度,找brown 彼此相鄰的跨度 SpanQuery[] quick_brown_dog = new SpanQuery[]{quick, brown, dog}; SpanNearQuery snq = new SpanNearQuery( quick_brown_dog, 4, true); //每個之間距離最大為4,第三個引數true為正順序 在匹配結果中排除重疊的跨度 SpanNearQuery quick_fox = new SpanNearQuery(new SpanQuery[]{quick, fox}, 1, true); SpanNotQuery quick_fox_dog = new SpanNotQuery(quick_fox, dog); //第一個引數表示要包含的, 第二個表示要排除的 SpanOrQuery類 SpanOrQuery or = new SpanOrQuery(new SpanQuery[]{first, second}); // SpanQuery類和QueryParser類 捐贈模組裡的QueryParser類可以支援SpanQuery 搜尋過濾 TermRangeFilter 只對包含特定範圍的文件進行操作。功能與TermRangeQuery類似 NumericRangeFilter 只對特定域的特定值範圍進行文件匹配操作。功能與NumericRangeQuery一致,但前者沒有評分操作 FieldCacheTermsFilter 針對特定項進行文件匹配操作,使用時可以結合FieldCache獲得更好的效能表現 FieldCacheRangeFilter 針對某個項或者某個數值範圍進行文件操作,使用時可以結合FieldCache獲得更好的效能 QueryWrapperFilter SpanQueryFilter PrefixFilter  只匹配包含特定域和特定字首的項的文件。 CachingWrapperFilter是其他過濾器的封裝器,它將結果快取起來以便再次使用,從而提高系統性能。 CachingSpanFilter 與上者一致,但是緩衝的目標是SpanFilter FilterDocIdSet 允許對過濾器進行過濾,一次處理一個文件,首先派生它的子類,然後在該子類中定義匹配方法。 TermRangeFilter NumericRangeFilter FieldCacheRangeFilter 特定項過濾 使用QueryWarpperFilter類 使用SpanQueryFilter類 安全過濾器 使用BooleanQuery類進行過濾 PrefixFilter 快取過濾結果 將filter封裝成query 對過濾器進行過濾 非Lucene內建的過濾器 使用功能查詢實現自定義評分 功能查詢的相關類 使用功能查詢對最近修改過的文件進行加權 針對多索引的搜尋 使用MultiSearch類 MultiSearcher searcher = new MultiSearcher(searchers); 使用ParallelMultiSearch進行多執行緒搜尋 使用項向量 查詢相似書籍 它屬於哪個類別 TermVectorMapper類 使用FieldSelector載入域 停止較慢的搜尋