Searcher类的方法
public final Hits search(Query query) throws IOException {
return search(query, (Filter)null);
}
发现原来是调用另一个重载的search类哦
public Hits search(Query query, Filter filter) throws IOException {
return new Hits(this, query, filter);
}
发现原来是构造一个Hits对象哦,参数是search本身,query和filter
那么循着足迹到了Hits类的构造方法,看他到底做了什么
Hits(Searcher s, Query q, Filter f) throws IOException {
weight = q.weight(s);//这里发现一个方法
searcher = s;
filter = f;
nDeletions = countDeletions(s);
getMoreDocs(50); // retrieve 100 initially
lengthAtStart = length;
}
转到weight方法
public Weight weight(Searcher searcher)
throws IOException {
Query query = searcher.rewrite(this);//发现一个方法
Weight weight = query.createWeight(searcher);//发现方法2
float sum = weight.sumOfSquaredWeights();
float norm = getSimilarity(searcher).queryNorm(sum);
weight.normalize(norm);
return weight;
}
转到rewrite方法
abstract public Query rewrite(Query query) throws IOException;
发现是个抽象方法哦,Search类不是有个子类IndexSearch吗?那找他去
public Query rewrite(Query original) throws IOException {
Query query = original;
for (Query rewrittenQuery = query.rewrite(reader); rewrittenQuery != query;
rewrittenQuery = query.rewrite(reader)) {
query = rewrittenQuery;
}
return query;
}
果真重写了哦,但是调用的居然是query的rewrite方法,看看去
public Query rewrite(IndexReader reader) throws IOException {
return this;
}
居然只是把自己返回去,IndexSearch方法一样是把这个query没做任何修改返回了,那么再看query.createWeight方法
protected Weight createWeight(Searcher searcher) throws IOException {
throw new UnsupportedOperationException();
}
- -抛个异常啊,看来又得子类重写了,那么随便找个子类把,看个简单的 PhraseQuery 吧。
protected Weight createWeight(Searcher searcher) throws IOException {
if (terms.size() == 1) { // optimize one-term case
Term term = (Term)terms.elementAt(0);
Query termQuery = new TermQuery(term);
termQuery.setBoost(getBoost());
return termQuery.createWeight(searcher);
}
return new PhraseWeight(searcher);
}
果然重写了setBoost()父类的方法设置boost值,getBoost(),获得Boost,默认的是1.0f
待续......................
public final Hits search(Query query) throws IOException {
return search(query, (Filter)null);
}
发现原来是调用另一个重载的search类哦
public Hits search(Query query, Filter filter) throws IOException {
return new Hits(this, query, filter);
}
发现原来是构造一个Hits对象哦,参数是search本身,query和filter
那么循着足迹到了Hits类的构造方法,看他到底做了什么
Hits(Searcher s, Query q, Filter f) throws IOException {
weight = q.weight(s);//这里发现一个方法
searcher = s;
filter = f;
nDeletions = countDeletions(s);
getMoreDocs(50); // retrieve 100 initially
lengthAtStart = length;
}
转到weight方法
public Weight weight(Searcher searcher)
throws IOException {
Query query = searcher.rewrite(this);//发现一个方法
Weight weight = query.createWeight(searcher);//发现方法2
float sum = weight.sumOfSquaredWeights();
float norm = getSimilarity(searcher).queryNorm(sum);
weight.normalize(norm);
return weight;
}
转到rewrite方法
abstract public Query rewrite(Query query) throws IOException;
发现是个抽象方法哦,Search类不是有个子类IndexSearch吗?那找他去
public Query rewrite(Query original) throws IOException {
Query query = original;
for (Query rewrittenQuery = query.rewrite(reader); rewrittenQuery != query;
rewrittenQuery = query.rewrite(reader)) {
query = rewrittenQuery;
}
return query;
}
果真重写了哦,但是调用的居然是query的rewrite方法,看看去
public Query rewrite(IndexReader reader) throws IOException {
return this;
}
居然只是把自己返回去,IndexSearch方法一样是把这个query没做任何修改返回了,那么再看query.createWeight方法
protected Weight createWeight(Searcher searcher) throws IOException {
throw new UnsupportedOperationException();
}
- -抛个异常啊,看来又得子类重写了,那么随便找个子类把,看个简单的 PhraseQuery 吧。
protected Weight createWeight(Searcher searcher) throws IOException {
if (terms.size() == 1) { // optimize one-term case
Term term = (Term)terms.elementAt(0);
Query termQuery = new TermQuery(term);
termQuery.setBoost(getBoost());
return termQuery.createWeight(searcher);
}
return new PhraseWeight(searcher);
}
果然重写了setBoost()父类的方法设置boost值,getBoost(),获得Boost,默认的是1.0f
待续......................