1,Field.Store與Field.Index
? Field.Store.COMPRESS:用壓縮的格式存儲最初的Field值
? Field.Store.NO:不存儲該Field的原始值
? Field.Store.YES:存儲該Field的原始值
? Field.Index.NO:不索引Field的值
? Field.Index.NO_NORMS:
? Field.Index.TOKENIZED:作分詞處理
? Field.Index.UN_TOKENIZED:不分詞,直接作為完整的信息段檢索,可以支持全匹配和相似匹配,跟數(shù)據(jù)庫中的like很類似。
2,實現(xiàn)Filter接口
????public?BitSet?bits(IndexReader?reader)?throws?IOException?{
????????final?BitSet?bits?=?new?BitSet(reader.maxDoc());//?默認所有都為false
????????//?設(shè)置所有的都不能檢索到
????????//?bits.set(0,?bits.size()?-?1,?false);
????????bits.set(3,?true);
????????bits.set(4);//設(shè)置為true
????????int[]?docs?=?new?int[1000];
????????int[]?freqs?=?new?int[1000];
????????TermDocs?termDocs?=?reader.termDocs(new?Term("title",?"測試"));
????????int?count?=?termDocs.read(docs,?freqs);//
????????for?(int?i?=?0;?i?<?docs.length;?i++)?{
????????????System.out.println(docs[i]+"--"+freqs[i]);
????????????bits.set(docs[i]);
????????}
????????return?bits;
????}
3,Term t = new Term("content", "電力");
? Query query = new TermQuery(t);
? 以上搜不到結(jié)果.原因是"電力"不是一個Term,用"電"或"力"則可以。
4,
reader.terms()返回索引中的所有term,沒有重復(fù)。而TermDocs存放term關(guān)聯(lián)的DocTermEnum?enumerator?=?reader.terms();
while?(enumerator.next())?{
Term?term?=?enumerator.term();
System.out.println(term.field()?+?"?"?+?term.text());
}
5,lucene不支持中文的*? ?匹配 ?
? 因為英文是基于詞的, 中文是基于字的 ?
? 英文mo?ey可以匹配到money ,因為money是一個term,? 中文怎么辦?除非中文有個好的分詞方案
6,兩次過濾后,query對象的tostring:
filtered(filtered(title:oracle content:oracle)->com.lucene.search.PrivilegeFilter@133d0fc)->com.lucene.search.CategoryFilter@dd5415
7,Hyper Estraier是一個用C語言開發(fā)的全文檢索引擎,
具有高速度,高穩(wěn)定性,高可擴展性?提供java,ruby的調(diào)用方法
<迅速搭建全文搜索平臺——開源搜索引擎實戰(zhàn)教程>
http://www.162cm.com/archives/date/2007/07/188,Hits hits = searcher.search (filteredquery, new Sort("fieldname"));//可根據(jù)第二個參數(shù)進行排序
int n=hits.id(2)? //參數(shù)是在hits中的下標,返回的結(jié)果是在過濾和排序之前在directory中的原始下標
9,
new一個BitSet(950)并不等于建立一個950大小的bs
只是說構(gòu)建出來的bs初始大小至少能容納950個bit,大小永遠是系統(tǒng)控制的。而且他的大小是64的倍數(shù),就算BitSet(1),他的大小也是64。
bitset.set(1, 4) 設(shè)置的是1,2,3,沒有4
10,對Field再進行切詞就是Term?Term和Token的區(qū)別
11,BooleanQuery的例子:
????? BooleanQuery bq = new BooleanQuery();
??? ? Query q1 = new TermQuery (new Term ("field", "one"));
??? ? Query q2 = new TermQuery (new Term ("sorter", "b"));
??? ? bq.add(q1, Occur.MUST);
??? ? bq.add(q2, Occur.MUST);
??? ? Hits hits = searcher.search(bq);
??? ?
?12,可用RAMDirectory作測試,見lucene自帶的測試
??? RAMDirectory directory = new RAMDirectory();
??? IndexWriter writer = new IndexWriter (directory, new WhitespaceAnalyzer(), true)
???
13,進行過濾時如果有多個filter,則某個doc是否能查到取決于這多個filter各自返回的bitset的綜合結(jié)果:要查得某一位置的doc,所有的filter的該位必須全部為true。所以查詢結(jié)果與filter的先后順序無關(guān)。
14,--按user為tom進行過濾
??? Filter f1 = new Filter() {
??? ??? ??? public BitSet bits(IndexReader reader) throws IOException {
??? ??? ??? ??? BitSet bitset = new BitSet(reader.maxDoc());
??? ??? ??? ??? TermDocs termDocs = reader.termDocs();// 實際是SegmentTermDocs
??? ??? ??? ??? Term term = new Term("user", "tom");
??? ??? ??? ??? termDocs.seek(term);//相當于持有了所有含有user為tom的doc的集合,但freq()和doc()還需要去文件中讀取?
??? ??? ??? ??? while (termDocs.next()) {
??? ??? ??? ??? ??? System.out.println("freq:"+termDocs.freq());
??? ??? ??? ??? ??? bitset.set(termDocs.doc());
??? ??? ??? ??? }
??? ??? ??? ??? return bitset;
??? ??? ??? }
??? ??? };
15,Trie,又稱單詞查找樹,是一種特殊的樹形結(jié)構(gòu),用于保存大量的字符串。它的優(yōu)點是:利用字符串的公共前綴來節(jié)約存儲空間。
http://www.javaeye.com/topic/299826
16,
doc相當于表中的記錄
field相當于字段
不同的doc可能有相同的field,也可能有不一樣的
我感覺比較適合用json格式存儲
field+分詞的關(guān)鍵字=term,是唯一的
term出現(xiàn)在哪些doc中,索引文件里有記載?
用Luke(http://code.google.com/p/luke)可以查看索引文件詳細信息
?