Asp.net mvc 3 lucene.net使用一个值搜索多个字段,使用另一个值搜索其他字段

Asp.net mvc 3 lucene.net使用一个值搜索多个字段,使用另一个值搜索其他字段,asp.net-mvc-3,c#-4.0,lucene.net,Asp.net Mvc 3,C# 4.0,Lucene.net,我有一个Lucene文档,涉及多个领域;名称、简要数据、完整数据、父ID(逗号分隔字符串)、产品类型、经验 我有一个带有文本框的搜索表单,下拉列表中有家长,下拉列表中有产品类型,下拉列表中有体验 如果我从文本框中搜索,我会得到应该得到的结果。如果我从任何下拉列表(或所有下拉列表)中搜索,我会得到想要的结果。如果我使用下拉列表和文本框,我会得到所有搜索文本框或下拉列表的结果。我想要的是文本框和下拉列表 因此,我的搜索构建了如下内容: if (string.IsNullOrWhite

我有一个Lucene文档,涉及多个领域;名称、简要数据、完整数据、父ID(逗号分隔字符串)、产品类型、经验

我有一个带有文本框的搜索表单,下拉列表中有家长,下拉列表中有产品类型,下拉列表中有体验

如果我从文本框中搜索,我会得到应该得到的结果。如果我从任何下拉列表(或所有下拉列表)中搜索,我会得到想要的结果。如果我使用下拉列表和文本框,我会得到所有搜索文本框或下拉列表的结果。我想要的是文本框和下拉列表

因此,我的搜索构建了如下内容:

        if (string.IsNullOrWhiteSpace(searchTerm))
        {
            searchTerm = "";
            if (!string.IsNullOrWhiteSpace(Request.QueryString["textbox"]))
            {
                string tester = Request.QueryString["query"];
                searchTerm += tester;
            }
            if (!string.IsNullOrWhiteSpace(Request.QueryString["parent"]))
            {
                searchTerm += searchTerm.Length > 0 ? " " : "";
                searchTerm += "+ParentIDs:" + Request.QueryString["parent"];
            }
            if (!string.IsNullOrWhiteSpace(Request.QueryString["product"]))
            {
                ProductTypes pt = db.ProductTypes.Find(int.Parse(Request.QueryString["product"]));
                if (pt != null) {
                    searchTerm += searchTerm.Length > 0 ? " " : "";
                    searchTerm += "+ProductType:" + pt.TypeName;
                }
            }
            if (!string.IsNullOrWhiteSpace(Request.QueryString["experience"]))
            {
                searchTerm += searchTerm.Length > 0 ? " " : "";
                searchTerm += "+Experience:" + Request.QueryString["experience"];
            }
        }
        if (!Directory.Exists(Helper.LuceneSearch._luceneDir))
            Directory.CreateDirectory(Helper.LuceneSearch._luceneDir);

        _searchResults = string.IsNullOrEmpty(searchField)
                            ? Helper.LuceneSearch.Search(searchTerm).Distinct()
                            : Helper.LuceneSearch.Search(searchTerm, searchField).Distinct();

        return View(_searchResults.Distinct());
如果我只搜索文本框和下拉列表parent,我会得到一个搜索词“north+ParentId:62”

我希望搜索只返回父项为62和(Name或BriefData或FullData为“north”)的结果

我尝试创建一个搜索词“+(名称:north-BriefData:north-FullData:north)+ParentId:62”和“名称:north-BriefData:north-FullData:north+ParentId:62”。第一个函数不返回结果,第二个函数返回的结果与只搜索+parentId:62相同

我认为这背后的逻辑相当简单。然而,我不知道我需要用代码写什么


请帮忙。:)

感谢JF Beaulac让我有理由查看我包含的Lucene.Net代码(Helper.LuceneSearch.Search(searchTerm.Distinct()),我重新编写了我的搜索,基本上不用麻烦使用它,而是在某种程度上复制了它

奇怪的是,我使用MultiFieldQueryParser进行了我想要的多字段搜索。然后,我将术语查询用于单字段查询。这些都被添加到BooleanQuery中,我的搜索是针对所述BooleanQuery执行的

var hits_limit = 1000;
var analyzer = new StandardAnalyzer(Version.LUCENE_29);
BooleanQuery bq = new BooleanQuery();
if (string.IsNullOrWhiteSpace(searchTerm))
{
    searchTerm = "";
    if (!string.IsNullOrWhiteSpace(Request.QueryString["textbox"]))
    {
        string tester = Request.QueryString["textbox"];
        var parser = new MultiFieldQueryParser(Version.LUCENE_29, new[] { "Name", "BriefData", "FullData" }, analyzer);
        var query = Helper.LuceneSearch.parseQuery(tester.Replace("*", "").Replace("?", ""), parser);
        bq.Add(query, BooleanClause.Occur.MUST);
    }
    if (!string.IsNullOrWhiteSpace(Request.QueryString["parent"]))
    {
        bq.Add(new TermQuery(new Term("ParentIDs", Request.QueryString["parent"])), BooleanClause.Occur.MUST);
    }
    if (!string.IsNullOrWhiteSpace(Request.QueryString["product"]))
    {
        ProductTypes pt = db.ProductTypes.Find(int.Parse(Request.QueryString["product"]));
        if (pt != null) {
            bq.Add(new TermQuery(new Term("ProductType", pt.TypeName)), BooleanClause.Occur.MUST);
        }
    }
    if (!string.IsNullOrWhiteSpace(Request.QueryString["experience"]))
    {
        bq.Add(new TermQuery(new Term("Experience", Request.QueryString["experience"])), BooleanClause.Occur.MUST);
    }
}
if (!System.IO.Directory.Exists(Helper.LuceneSearch._luceneDir))
    System.IO.Directory.CreateDirectory(Helper.LuceneSearch._luceneDir);

var searcher = new IndexSearcher(Helper.LuceneSearch._directory, false);
var hits = searcher.Search(bq, null, hits_limit, Sort.RELEVANCE).ScoreDocs;
var results = Helper.LuceneSearch._mapLuceneToDataList(hits, searcher).Distinct();
analyzer.Close();
searcher.Close();
searcher.Dispose(); 

return View(results);

需要注意的是,为了让产品和体验字段正常工作,我必须在将它们添加到索引时将它们设置为“Field.Index.NOT_analysis”。我猜这是因为每个文档只有一个值。其他搜索字段是“Field.Index.analysis”。

您使用的是什么分析器?另外,您确定在指定字段中有包含“north”的索引数据吗?我不知道分析器。我的搜索代码是张贴的。我肯定有北索引。如果我只搜索north,那么我会从各个字段(Name、BriefData、FullData)中获得所有应该得到的结果。我需要的是能够将搜索north的结果限制为仅包含所选ParentID的结果。为了将搜索ParentID的结果限制为在Name、BriefData和FullData字段中包含north的结果,您发布的代码基本上与lucene.net无关,我所能看到的只是构建一个字符串以向QueryParser提供信息,然后将其传递到LuceneSearch助手类中的代码