利用Lucene.net实现站内搜索功能,用输入的关键字去匹配已生成索引文件中字段获得的结果是符合要求的,但当有选择某一个种类型时,却把所有这种类型的数据都搜出来了,关键字似乎已经不起作用了,求大虾帮忙解决下。
“and”、“or”条件查询的主要代码如下:
BooleanQuery bq = new BooleanQuery();
QueryParser cnParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "GameCnName", analyzer);
Query cnQuery = cnParser.Parse(keyword);
bq.Add(cnQuery, BooleanClause.Occur.SHOULD);//游戏中文名
QueryParser enQueryParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "GameEnName", analyzer);
Query enQuery = enQueryParser.Parse(keyword);
bq.Add(enQuery, BooleanClause.Occur.SHOULD); //游戏英文名
QueryParser companyQueryParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "CompanyName", analyzer);
Query companyQuery = companyQueryParser.Parse(keyword);
bq.Add(companyQuery, BooleanClause.Occur.SHOULD); //游戏公司名
if (queryDictionary.ContainsKey("GamePlatform"))
{
Query pfQuery = new TermQuery(new Term("GamePlatform", queryDictionary["GamePlatform"]));
bq.Add(pfQuery, BooleanClause.Occur.MUST); //游戏平台
}
if (queryDictionary.ContainsKey("NavCategory"))
{
Query navQuery = new TermQuery(new Term("NavCategory", queryDictionary["NavCategory"]));
bq.Add(navQuery, BooleanClause.Occur.MUST); //游戏产地
}
if (queryDictionary.ContainsKey("GameEngine"))
{
Query engQuery = new TermQuery(new Term("GameEngine", queryDictionary["GameEngine"]));
bq.Add(engQuery, BooleanClause.Occur.MUST); //游戏画面
}
Must 和 Should 在一起 是取得Must结果的倒排序结果 如果文档包含Should的结果,则增加打分。
Must和Must在一起取交集。
Should和Should一起取并集。
BooleanQuery typeChild = null; //匹配类型
BooleanQuery keyChild = null; //匹配关键字
将匹配关键字的Query都添加到keyChild 中,将匹配类型的Query都添加到typeChild 中
如: QueryParser cnParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "GameCnName", analyzer);//游戏中文名
Query cnQuery = cnParser.Parse(keyword);
if (keyChild != null) keyChild.Add(cnQuery, BooleanClause.Occur.SHOULD);
else
{
keyChild = new BooleanQuery();
keyChild.Add(cnQuery, BooleanClause.Occur.SHOULD);
}
……
if (queryDictionary.ContainsKey("GamePlatform"))//游戏平台
{
Query pfQuery = new TermQuery(new Term("GamePlatform", queryDictionary["GamePlatform"]));
if (typeChild != null) typeChild.Add(pfQuery, BooleanClause.Occur.MUST);
else
{
typeChild = new BooleanQuery();
typeChild.Add(pfQuery, BooleanClause.Occur.MUST);
}
}
最后对两个BooleanQuery 进行MUST处理
BooleanQuery bq = new BooleanQuery();
//对“关键字”和“类型”两个条件的取交集
if (typeChild != null && keyChild != null)
{
bq.Add(keyChild, BooleanClause.Occur.MUST);
bq.Add(typeChild, BooleanClause.Occur.MUST);
}
else if (typeChild == null) bq = keyChild; //仅用关键字搜索
else if (keyChild == null) bq = typeChild; //仅用类型搜索
哈哈,问题圆满解决,查处的结果就是全部输入某种类型下,但同时又与关键字相匹配。
@psforever: 代码能再给完整点吗?
@浮生若梦丶丶: http://www.cnblogs.com/psforever/archive/2011/10/06/2200019.html
这是全部代码吗?
全部代码可以参考我的这篇博文
http://www.cnblogs.com/psforever/archive/2011/10/06/2200019.html