Lucene讀書筆記——5. 高階搜尋技術
阿新 • • 發佈:2019-01-11
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卻必修列舉出該項在該文件中所有的出現地點。
跨度查詢的構建模組: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載入域
停止較慢的搜尋
SpanQuery型別 | 描 述 |
SpanTermQuery | 和其他跨度查詢型別結合使用。單獨使用時相當於TermQuery |
SpanFirstQuery | 用來匹配各個域的首部分的各個跨度 |
SpanNearQuery | 用來匹配臨近跨度 |
SpanNotQuery | 用來匹配不重疊的跨度 |
FieldMaskingSpanQuery | 封裝其他SpanQuery類,但程式會認為已匹配到另外的域。該功能可用於針對多個域的跨度查詢 |
SpanOrQuery | 跨度查詢的聚合匹配 |