MDA/MDD/TDD/DDD/DDDDDDD
          posts - 536, comments - 111, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          lucene筆記

          Posted on 2008-03-27 16:15 leekiang 閱讀(857) 評論(0)  編輯  收藏 所屬分類: lucene
          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:不分詞,直接作為完整的信息段檢索,可以支持全匹配和相似匹配,跟數據庫中的like很類似。

          2,實現Filter接口
          ????public?BitSet?bits(IndexReader?reader)?throws?IOException?{
          ????????
          final?BitSet?bits?=?new?BitSet(reader.maxDoc());//?默認所有都為false
          ????????
          //?設置所有的都不能檢索到
          ????????
          //?bits.set(0,?bits.size()?-?1,?false);
          ????????bits.set(3,?true);
          ????????bits.set(
          4);//設置為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);
          ? 以上搜不到結果.原因是"電力"不是一個Term,用"電"或"力"則可以。

          4,reader.terms()返回索引中的所有term,沒有重復。而TermDocs存放term關聯的Doc
          TermEnum?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語言開發的全文檢索引擎,
          具有高速度,高穩定性,高可擴展性?提供java,ruby的調用方法
          <迅速搭建全文搜索平臺——開源搜索引擎實戰教程>
          http://www.162cm.com/archives/date/2007/07/18

          8,Hits hits = searcher.search (filteredquery, new Sort("fieldname"));//可根據第二個參數進行排序
          int n=hits.id(2)? //參數是在hits中的下標,返回的結果是在過濾和排序之前在directory中的原始下標

          9,
          new一個BitSet(950)并不等于建立一個950大小的bs
          只是說構建出來的bs初始大小至少能容納950個bit,大小永遠是系統控制的。而且他的大小是64的倍數,就算BitSet(1),他的大小也是64。
          bitset.set(1, 4) 設置的是1,2,3,沒有4

          10,對Field再進行切詞就是Term?Term和Token的區別

          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的綜合結果:要查得某一位置的doc,所有的filter的該位必須全部為true。所以查詢結果與filter的先后順序無關。

          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,又稱單詞查找樹,是一種特殊的樹形結構,用于保存大量的字符串。它的優點是:利用字符串的公共前綴來節約存儲空間。
          http://www.javaeye.com/topic/299826

          16,
          doc相當于表中的記錄
          field相當于字段
          不同的doc可能有相同的field,也可能有不一樣的
          我感覺比較適合用json格式存儲
          field+分詞的關鍵字=term,是唯一的
          term出現在哪些doc中,索引文件里有記載?
          用Luke(http://code.google.com/p/luke)可以查看索引文件詳細信息
          ?
          主站蜘蛛池模板: 邹平县| 宁德市| 交城县| 区。| 垣曲县| 昭通市| 东乡县| 长宁县| 奉化市| 阿克陶县| 微博| 民和| 马龙县| 屯留县| 抚州市| 宁化县| 金坛市| 当阳市| 石门县| 原阳县| 象州县| 邹平县| 鹿泉市| 宝鸡市| 安阳县| 廊坊市| 八宿县| 蚌埠市| 酒泉市| 澄迈县| 昌图县| 凤冈县| 永和县| 海丰县| 军事| 溧水县| 三穗县| 聂荣县| 靖边县| 子长县| 塔城市|