组织Lunene目录

时间:2011-04-20 02:59:25

标签: lucene lucene.net

我有一组记录。每条记录可以有多种技能和一种状态。

所以你可能有技能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真的是这样的方式还是有更好的方法?

2 个答案:

答案 0 :(得分:0)

答案 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"