Lucene查询- "Match exactly one of x, y, z"

标签 lucene lucene.net

我有一个Lucene索引,其中包含具有“类型”字段的文档,该字段可以是“文章”,“论坛”或“博客”三个值之一。我希望用户能够在这些类型中进行搜索(每种文档类型都有一个复选框)

如何根据用户选择的类型创建Lucene查询?

有两个先决条件:

  • 如果用户未选择任何一种类型,则我希望没有该类型的结果。
  • 限制类型字段不应该影响结果的顺序。

  • 作为引用,如果我要用SQL编写(用于“博客或论坛搜索”),我会写:
    SELECT * FROM Docs
    WHERE [type] in ('blog', 'forum')
    

    最佳答案

    供引用,如果其他任何人遇到此问题,这是我的解决方案:

    IList<string> ALL_TYPES = new[] { "article", "blog", "forum" };
    string q = ...; // The user's search string
    IList<string> includeTypes = ...; // List of types to include
    Query searchQuery = parser.Parse(q);
    Query parentQuery = new BooleanQuery();
    parentQuery.Add(searchQuery, BooleanClause.Occur.SHOULD);
    // Invert the logic, exclude the other types
    foreach (var type in ALL_TYPES.Except(includeTypes))
    {
        query.Add(
            new TermQuery(new Term("type", type)),
            BooleanClause.Occur.MUST_NOT
        );
    }
    searchQuery = parentQuery;
    

    我颠倒了逻辑(即排除了用户未选择的类型),因为如果不这样做,结果的顺序就会丢失。我不确定为什么...!很可惜,因为它使代码不太清晰/难以维护,但至少可以正常工作!

    关于Lucene查询- "Match exactly one of x, y, z",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1553966/

    相关文章:

    search - Lucene 评分 : in what context is queryNorm used?

    lucene - Sitecore 7 Lucene : strip HTML from computed field

    indexing - 如何使用 Lucene.NET 计算文档的 "OnTopicness"

    c# - Lucene.Net 大于/小于 TermRangeQuery?

    sql-server - SQL Server 2008 全文搜索 (FTS) 与 Lucene.NET

    java - 使用 Lucene 作为存储

    java - 解析查询时 Lucene token 流的开头和结尾是什么?

    solr - 如何删除一个月前的文件

    asp.net - 搜索引擎 - Lucene 或 Solr

    .net - 如何索引数字字段并在 Lucene.Net 中按范围搜索它们?