我目前正在研究一个涉及C#中Lucene库的项目,但是我的项目设计问题涉及到索引中文档的撤销。我的索引中的文档已经创建了几个字段,我希望能够在这两个字段之间进行过滤,然后在这个子集中搜索术语,但我仍然熟悉lucene并且我不完全确定这是否可能。我已经学会了如何执行基本查询,但我认为我应该使用lucenes过滤器类,但我不确定如何。如果有人能就此提出建议,我会很高兴
我正在完成的项目涉及索引来自各种电子邮件帐户的电子邮件。我索引中的文档包含以下某些字段: 帐号:(例如fake@fake.com) 文件夹:(例如已发送,垃圾箱,收件箱......) 数据:(电子邮件正文)
我希望能够过滤我的索引,以便我可以拥有一个仅包含来自特定帐户和文件夹的文档的子集,然后我希望能够搜索该子集的数据字段。
答案 0 :(得分:4)
正如@Jf Beaulac建议的那样,你可以使用BooleanQuery进行“过滤”。
private Query CreateFilteredQuery (string account, string folder, Query criteria)
{
BooleanQuery bq = new BooleanQuery();
bq.Add(new TermQuery (new Lucene.Net.Index.Term ("account", account)), BooleanClause.Occur.MUST);
bq.Add(new TermQuery (new Lucene.Net.Index.Term ("folder", folder)), BooleanClause.Occur.MUST);
bq.Add(criteria, BooleanClause.Occur.MUST);
return bq;
}
Query filteredQuery = CreateFilteredQuery ("fake@fake.com", "inbox", myQueryParser.Parse (criteria));
var hits = myIndexSearcher.Search (filteredQuery);
以下是关于查询和过滤器之间差异的一个很好的问题:Why do we use Filters while searching