利用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); //游戏画面
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); //游戏画面
解决方案 »
- 紧急求助,asp.net要如何避免触发Button时的自动刷新
- C#使用Word.dll打开Word遇到文件转换对话框怎么办?
- varbinary字段的操作问题
- 有关XSL XML,ASP。NET的简单问题,在线等,马上结贴
- 去掉字符串的前后的单引号,如何操作?
- Log4Net怎么用!
- 高手啊,请教一个关于下拉列表框的问题
- ID4175: IssuerNameRegistry 无法识别安全令牌的颁发者。若要接受来自此颁发者的安全令牌,请将 IssuerNameRegistry 配置
- 用户控件不响应任何事件?!!!
- 行过滤器中不允许使用位操作符吗?
- 执行不到语句response.write
- 开发ASP.NET网站的后台代码DBHelper类怎么写啊?
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; //仅用类型搜索哈哈,问题圆满解决,查处的结果就是全部输入某种类型下,但同时又与关键字相匹配。