Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将动态过滤器传递到Lucene Net C中创建的索引#_C#_.net_Lucene_Lucene.net - Fatal编程技术网

C# 将动态过滤器传递到Lucene Net C中创建的索引#

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 ='

我已经从我的项目中创建了Lucene索引&如果条件过滤器是硬编码的,那么查询和过滤工作正常,所以在搜索时,它只会得到匹配的过滤词&我将在其中进行搜索。现在我想根据我的要求通过过滤器&我不想硬编码过滤器条件。例如,我将通过过滤器,比如学生应该属于特定的系&他/她应该被选为特定的科目。一些科目使用sql编写的代码如下

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;
    }