C# 将动态过滤器传递到Lucene Net C中创建的索引#
我已经从我的项目中创建了Lucene索引&如果条件过滤器是硬编码的,那么查询和过滤工作正常,所以在搜索时,它只会得到匹配的过滤词&我将在其中进行搜索。现在我想根据我的要求通过过滤器&我不想硬编码过滤器条件。例如,我将通过过滤器,比如学生应该属于特定的系&他/她应该被选为特定的科目。一些科目使用sql编写的代码如下C# 将动态过滤器传递到Lucene Net C中创建的索引#,c#,.net,lucene,lucene.net,C#,.net,Lucene,Lucene.net,我已经从我的项目中创建了Lucene索引&如果条件过滤器是硬编码的,那么查询和过滤工作正常,所以在搜索时,它只会得到匹配的过滤词&我将在其中进行搜索。现在我想根据我的要求通过过滤器&我不想硬编码过滤器条件。例如,我将通过过滤器,比如学生应该属于特定的系&他/她应该被选为特定的科目。一些科目使用sql编写的代码如下 select * from dbo.[Student] where departmentId=1 and subject ='
select * from dbo.[Student] where departmentId=1
and subject ='history'
IO使用binaryquery实现了这一点。现在我想要像这样通过过滤器
select * from dbo.[Student] where departmentId=1
and subject in('history','general')
and (class='5sem' or class='6sem')
或
搜索方法
公共数据集搜索(字符串标准、字符串术语、字符串筛选器){
Lucene.Net.Store.Directory=FSDirectory.Open(新目录信息(@“D:\LuceneIndex”); Analyzer Analyzer=新的StandardAnalyzer(Lucene.Net.Util.Version.Lucene_30)
BooleanQuery bq=new BooleanQuery();
IndexReader IndexReader=IndexReader.Open(目录,true);
Searcher Searcher=newindexsearcher(indexReader);
var queryParser=新的queryParser(Lucene.Net.Util.Version.Lucene_30,标准,分析器);
queryParser.AllowReadingWildcard=true;
var query=queryParser.Parse(term.ToLower()+“*”);
添加(查询、发生、必须);
foreach(filter.Split(',')中的字符串str)
{
如果(str.Split(“$”).Length==3)
{
如果(str.Split(“$”)[1]==”)
{
添加(新术语查询(新术语(str.Split(“$”)[0],(str.Split(“$”)[2]).ToLower()),必须出现);
}
else if(str.Split(“$”)[1]=“”)
{
添加(新术语查询(新术语(str.Split(“$”)[0],(str.Split(“$”)[2]).ToLower())出现。不能出现);
}
}
}
TopDocs resultDocs=searcher.Search(bq,null,indexReader.MaxDoc,Sort.RELEVANCE);
var topDocs=resultDocs.ScoreDocs;
数据集学生=新数据集();
DataTable dt=新的DataTable();
dt.列添加(“UAN”);
dt.列。添加(“名字”);
DataRow行=null;
foreach(topDocs中的var命中)
{
var documentfromsrach=searcher.Doc(hit.Doc);
row=dt.NewRow();
行[“UAN”]=documentfromsrach.Get(“UAN”);
行[“FirstName”]=documentfromsrach.Get(“FirstName”);
dt.行。添加(行);
}
学生。表格。添加(dt);
留学生;
}
在搜索按钮上单击
StudentLuceneIndex.StudentLuceneIndexSearch obj=新的StudentLuceneIndex.StudentLuceneIndexSearch(); 数据集ds=obj.Search(“全部”,“*”+textBox1.Text.Trim(),“部门ID$=$1,主题$=$history”)
如何在lucene.net中实现这种类型的过滤器?如果您提供您尝试过的代码,那就太好了!没有看到索引代码。。。Lucene字段名区分大小写。根据使用的分析器,值可能太大。看看foreach中的名字,你在把它们大写。但是您的搜索语法都是小写的。名称必须完全匹配。如果您提供您尝试过的代码,那就太好了!没有看到索引代码。。。Lucene字段名区分大小写。根据使用的分析器,值可能太大。看看foreach中的名字,你在把它们大写。但是您的搜索语法都是小写的。名称必须完全匹配。
select * from dbo.[Student] where subject in('history','general')
and departmentId=1 and (class='5sem' or class='6sem')
BooleanQuery bq = new BooleanQuery();
IndexReader indexReader = IndexReader.Open(directory, true);
Searcher searcher = new IndexSearcher(indexReader);
var queryParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_30, criterion, analyzer);
queryParser.AllowLeadingWildcard = true;
var query = queryParser.Parse(term.ToLower() + "*");
bq.Add(query, Occur.MUST);
foreach (string str in filter.Split(','))
{
if (str.Split('$').Length == 3)
{
if (str.Split('$')[1] == "=")
{
bq.Add(new TermQuery(new Term(str.Split('$')[0], (str.Split('$')[2]).ToLower())), Occur.MUST);
}
else if (str.Split('$')[1] == "<>")
{
bq.Add(new TermQuery(new Term(str.Split('$')[0], (str.Split('$')[2]).ToLower())), Occur.MUST_NOT);
}
}
}
TopDocs resultDocs = searcher.Search(bq, null, indexReader.MaxDoc, Sort.RELEVANCE);
var topDocs = resultDocs.ScoreDocs;
DataSet Students = new DataSet();
DataTable dt = new DataTable();
dt.Columns.Add("UAN");
dt.Columns.Add("Firstname");
DataRow row = null;
foreach (var hit in topDocs)
{
var documentFromSerach = searcher.Doc(hit.Doc);
row = dt.NewRow();
row["UAN"] = documentFromSerach.Get("UAN");
row["FirstName"] = documentFromSerach.Get("FirstName");
dt.Rows.Add(row);
}
Students.Tables.Add(dt);
return Students;
}