BooleanClause.Occur[]数组表示多个条件之间的关系。其中,
BooleanClause.Occur.MUST | and |
BooleanClause.Occur.MUST_NOT | not |
BooleanClause.Occur.SHOULD | or |
日本:
MUTOH编码器、MUTOH控制器
OGURA(小仓)离合器
这时候,需要把约束条件改成“日本”、“小仓”、“离合器”三个词都出现在同一条记录即可匹配。
重写的getFieldQuery函数如下:
protected Query getFieldQuery(String field, String queryText, int slop)
throws ParseException {
TokenStream source = analyzer.tokenStream(field, new StringReader(
queryText));
ArrayList<Token> v = new ArrayList<Token>(10);
Token t;
while (true) {
try {
t = source.next();
} catch (IOException e) {
t = null;
}
if (t == null)
break;
v.add(t);
}
try {
source.close();
} catch (IOException e) {
// ignore
}
if (v.size() == 0)
return null;
else if (v.size() == 1)
return new TermQuery(new Term(field, ((Token) v.get(0)).termText()));
else {
PhraseQuery q = new PhraseQuery();
BooleanQuery b = new BooleanQuery();
q.setBoost(2048.0f);
b.setBoost(0.001f);
for (int i = 0; i < v.size(); i++) {
Token token = v.get(i);
q.add(new Term(field, token.termText()));
TermQuery tmp = new TermQuery(new Term(field, token.termText()));
tmp.setBoost(0.01f);
b.add(tmp, BooleanClause.Occur.SHOULD);
}
BooleanQuery bQuery = new BooleanQuery();
bQuery.add(q, BooleanClause.Occur.SHOULD);
bQuery.add(b, BooleanClause.Occur.SHOULD);
return bQuery;
}
}简要说一下程序的主要功能:
首先queryText分解为token的形式(即词的形式);
将TokenStream内的词语写入迭代器里(ArryList);
设定“词组”与连接词的优先关系,并将各个词组写入词组分析器里
合并两个查询