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