利用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);  //游戏画面

解决方案 »

  1.   

    谢谢楼上给出的参考,但是似乎还是不行,根据那个思路我找到了解决的办法,方法如下: 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; //仅用类型搜索哈哈,问题圆满解决,查处的结果就是全部输入某种类型下,但同时又与关键字相匹配。