Lucene 组织一个Lunene目录
我有一套唱片。每个记录可以有多个技能和一个状态 所以你可能有a、b、c技能的记录,还有维多利亚州的记录 我需要能够搜索任何记录,说技能a在维多利亚或技能a和c在维多利亚目录 我很难创建一个有效的目录,使我能够以我想要的方式搜索 起初,我创建了一个目录,其中包含Lucene 组织一个Lunene目录,lucene,lucene.net,Lucene,Lucene.net,我有一套唱片。每个记录可以有多个技能和一个状态 所以你可能有a、b、c技能的记录,还有维多利亚州的记录 我需要能够搜索任何记录,说技能a在维多利亚或技能a和c在维多利亚目录 我很难创建一个有效的目录,使我能够以我想要的方式搜索 起初,我创建了一个目录,其中包含skills:abc state:vic 然后我尝试了技能:a、b、c状态:vic 但是搜索这些并没有给我正确的结果。事实上,当我有一个疑问 skills:a,b AND state:vic, skills: a OR b AND stat
skills:abc state:vic
然后我尝试了技能:a、b、c状态:vic
但是搜索这些并没有给我正确的结果。事实上,当我有一个疑问
skills:a,b AND state:vic,
skills: a OR b AND state:vic,
skills: a OR skills:b AND state:vic
以上所有操作都会返回技能:a和state:vic的一组记录
有什么想法吗
编辑
自从发布这篇文章以来,我已经让它发挥了作用,但我不确定这是否是正确的方法
我将所有技能组合到一个领域,并将它们分隔开来。技能是GUID格式的
然后在我的搜索方法中,我这样做
queryString = "skills:(skill1 OR skill2 OR skill3) AND state:Vic";
Query query = parser.Parse(queryString);
这很好,速度也很快,但是创建查询字符串真的是一种方法吗?或者有更好的方法吗?你可以使用布尔查询:你可以使用布尔查询:你可以直接构建你的布尔查询,而不是通过查询parser
。这要求在向用户展示搜索界面时,输入不同的技能和状态字段
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"
您可以直接构建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"
我确实试过了,是的,结果完全一样。自从发布这篇文章以来,我已经取得了一些成功,并在我的问题中添加了这一点。我确实尝试过,是的,并且得到了完全相同的结果。我已经有了一些成功,因为张贴这一点,并已添加到我的问题