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关联的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语言开发的全文检索引擎,
具有高速度,高稳定性,高可扩展性?提供java,ruby的调用方法
<迅速搭建全文搜索平台——开源搜索引擎实战教程>
http://www.162cm.com/archives/date/2007/07/188,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)可以查看索引文件详细信息