【问题标题】:Filter index for searching in Lucene.net在 Lucene.net 中搜索的过滤器索引
【发布时间】:2011-10-05 15:04:44
【问题描述】:

我目前正在从事一个涉及 C# 中的 Lucene 库的项目,但是我在项目设计中遇到了一个问题,即检索索引中的文档。我的索引中的文档是用几个字段创建的,我希望能够在其中两个字段之间进行过滤,然后在这个子集中搜索术语但是我仍然熟悉 lucene 并且不完全确定这是否可能.我已经学会了如何执行基本查询,但我认为我应该使用 lucenes 过滤器类,但我不确定如何。如果有人能就此提供建议,我将不胜感激

我正在完成的项目涉及索引来自各种电子邮件帐户的电子邮件。我的索引中的文档具有以下一些字段: 帐户:(例如 fake@fake.com) 文件夹:(例如已发送、垃圾箱、收件箱...) 数据:(电子邮件正文)

我希望能够过滤我的索引,这样我就可以拥有一个仅包含来自特定帐户和文件夹的文档的子集,然后我希望能够搜索该子集的数据字段。

【问题讨论】:

  • 提供有关您正在执行的查询的更多详细信息以及您要应用过滤器的字段中的数据将有助于为您提供建议
  • 了解您的意思是查询还是过滤器也会很有用。查询将直接查找数据,但过滤器用于从查询中检索数据子集。过滤器是必要的还是我们正在谈论独特的个人呼叫,因此它会是一个查询?
  • 从您的附加输入中,您不需要使用过滤器而是在 BooleanQuery 中组合多个条件,您是使用 QueryParser 还是使用 BooleanQuery 类手动构建查询?

标签: c# lucene indexing lucene.net filtering


【解决方案1】:

正如@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

【讨论】:

    猜你喜欢
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多