Lucene 组织一个Lunene目录

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

我有一套唱片。每个记录可以有多个技能和一个状态

所以你可能有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 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"

我确实试过了,是的,结果完全一样。自从发布这篇文章以来,我已经取得了一些成功,并在我的问题中添加了这一点。我确实尝试过,是的,并且得到了完全相同的结果。我已经有了一些成功,因为张贴这一点,并已添加到我的问题