我有一组记录。每条记录可以有多种技能和一种状态。
所以你可能有技能a,b和c以及维多利亚州的记录。
我需要能够在目录中搜索维多利亚州的技能a或维多利亚州的技能a和c的任何记录。
我无法创建一个有效的目录,允许我以我想要的方式进行搜索。
首先我用skills: a b c state:vic
创建了一个目录
然后我尝试了skills: a,b,c state:vic
但是搜索这些并没有给我正确的结果。事实上,当我有一个查询;
skills:a,b AND state:vic,
skills: a OR b AND state:vic,
skills: a OR skills:b AND state:vic
以上都返回skills: a AND state:vic
的一组记录。
有什么想法吗?
修改
自发布以来,我已经开始工作但不确定这是否是正确的方法。
我将所有技能组合到一个领域,并将空间分开。技能采用GUID格式。
然后在我的搜索方法中,我这样做;
queryString = "skills:(skill1 OR skill2 OR skill3) AND state:Vic";
Query query = parser.Parse(queryString);
这个工作正常,而且非常快,但是创建一个queryString真的是这样的方式还是有更好的方法?
答案 0 :(得分:0)
您可以使用BooleanQuery:http://geekswithblogs.net/rgupta/archive/2009/01/07/lucene-multifield-searches.aspx
答案 1 :(得分:0)
您可以直接构建BooleanQuery
,而不是通过QueryParser
。这要求您在向用户展示搜索界面时区分技能和状态输入字段。
var skillQuery = new BooleanQuery {
{ new TermQuery(new Term("skills", "skill1")), Occur.SHOULD },
{ new TermQuery(new Term("skills", "skill2")), Occur.SHOULD },
{ new TermQuery(new Term("skills", "skill3")), Occur.SHOULD }
};
var query = new BooleanQuery() {
{ skillQuery, Occur.MUST },
{ new TermQuery(new Term("state", "Vic")), Occur.MUST }
};
// query = "+(skills:skill1 skills:skill2 skills:skill3) +state:Vic"
在搜索技能时允许自由文本输入仍需要拨打QueryParser.Parse
。
var analyzer = new StandardAnalyzer(Version.LUCENE_30);
var skillParser = new QueryParser(Version.LUCENE_30, "skills", analyzer);
var skillQuery = skillParser.Parse("skill1, skill2, skill3");
var query = new BooleanQuery() {
{ skillQuery, Occur.MUST },
{ new TermQuery(new Term("state", "Vic")), Occur.MUST }
};
// query = "+(skills:skill1 skills:skill2 skills:skill3) +state:Vic"