.1 测试代码
.1-1 写入代码
public static void writeIndex() throws IOException{
Directory directory = FSDirectory.open(Paths.get("/Users/waixingren/bigdata-java/mysolr52test/lucenecountdata"));
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(analyzer);
config.setUseCompoundFile(false);
IndexWriter indexWriter = new IndexWriter(directory, config);
Document doc1 = newDoc("1", "cubeli", "one of tencent employee");
Document doc2 = newDoc("2", "liyong", "one of tencent employee");
Document doc3 = newDoc("3", "yangziying", "one of tencent employee");
Document doc4 = newDoc("4", "litairan", "one of tencent employee");
Document doc5 = newDoc("5", "zhanshan", "one of tencent employee");
Document doc6 = newDoc("6", "cubeli", "one of tencent employee");
Document doc7 = newDoc("7", "lisi", "one of tencent employee");
Document doc8 = newDoc("8", "wangwu", "cubeli, one of tencent employee");
Document doc9 = newDoc("9", "xiaomi", "one of tencent employee");
Document doc10 = newDoc("10", "taotao,yes he is cubeli son", "one of tencent employee");
Document doc11 = newDoc("11", "cubeli, cubeli", "cubeli is one of tencent employee, yes cubeli");
indexWriter.addDocument(doc1);
indexWriter.addDocument(doc2);
indexWriter.addDocument(doc3);
indexWriter.addDocument(doc4);
indexWriter.addDocument(doc5);
indexWriter.addDocument(doc6);
indexWriter.addDocument(doc7);
indexWriter.addDocument(doc8);
indexWriter.addDocument(doc9);
indexWriter.addDocument(doc10);
indexWriter.addDocument(doc11);
indexWriter.close();
}
.1-2 读取代码
Directory directory = FSDirectory.open(Paths.get("/Users/waixingren/bigdata-java/mysolr52test/lucenecountdata"));
DirectoryReader reader = DirectoryReader.open(directory);
IndexSearcher isearcher = new IndexSearcher(reader);
Query filter1 = new TermQuery(new Term("desc","cubeli"));
Query filter2 = NumericRangeQuery.newIntRange("id", 6, 11, true, true);//这里会生成一个multitermquery,因为相比于上一个termquery的一个值,这个query会有多个值,比如7,8,9,10
BooleanQuery bq = new BooleanQuery();
bq.add(filter1, Occur.MUST);
bq.add(filter2, Occur.MUST);//两个都是MUST,表示要求交集
TopDocs topDocs = isearcher.search(bq, Integer.MAX_VALUE);
ScoreDoc scoreDocs[] = topDocs.scoreDocs;
for(int i = 0; i < scoreDocs.length; i++){
Document document = isearcher.doc(scoreDocs[i].doc);
System.out.println(document.get("id") + ", " + document.get("name") + ", " + document.get("desc"));
}
.2 源码分析
.2-1createweight
如上图所示,这里会构造一个BooleanWeight,在构造的过程中,使用子query生成多个子weight,添加到一个list中,作为BooleanWeight的一个成员变量weights.
.2-1-1 TermQuery构造weight
这里的seekExact方法,就是先判断这个term是否存在,详细解析见
.2-1-2 MultiTermQueryConstantScoreWrapper构造weight
.2-2 构造scorer
尝试使用第一个weight构造scorer,如果失败,就返回null,例如如果是求交集,那么使用一个scorer是不行的:
所以,要走以下流程构造scorer:
注意,对于multiterm来说,需要遍历所有的term值,例如:
.2-3 求交集/并集/差集
未完待续。。。