MDA/MDD/TDD/DDD/DDDDDDD
posts - 536, comments - 111, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

lucene笔记

Posted on 2008-03-27 16:15 leekiang 阅读(839) 评论(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(3true);
        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)可以查看索引文件详细信息
 

只有注册用户登录后才能发表评论。


网站导航: