none
请帮忙给个思路(急) RRS feed

  • 问题

  • 有3个数组,标题Title,栏目Column,文件名filename.他们的元素个数是一样的。
    我使用lucene.net全文检索后得到了文件名,根据文件名判断它和文件名数组中的哪个元素值一样,这样就可以根据数组的索引得到与该文件名相关的栏目信息。
    要实现的功能:
                        组合检索。同时检索标题,栏目,正文。
                        比如,单个检索标题a,可以得到1,2,3,4,5.。
                                 单个检索栏目b,可以得到1,3,4。
                                 单个检索正文的关键词c,可以得到,2,4.
                                同时对它们3个一起检索,得到4. 

    给出部分同时检索栏目和标题的代码。

      private ArrayList Search()
            {
                ArrayList result = new ArrayList();
                int stVol = 0;
                int edVol = 0;

                if (!CountVol(ref stVol, ref edVol))
                {
                    return result;
                }

                for (int i = this.VolSum[stVol]; i < this.VolSum[edVol + 1]; i++)
                {
                    result.Add(i);
                }

                int index;
                if (this.tbTitle.Text != "")
                {
                    for (int i = 0; i < result.Count; )
                    {
                        index = (int)result[i];
                        if (this.Idx.Title[index].IndexOf(this.tbTitle.Text) == -1)
                        {
                            result.RemoveAt(i);
                            continue;
                        }
                        i++;
                    }
                }

               if (this.tbCol.Text != "")
                {
                    for (int i = 0; i < result.Count; )
                    {
                        index = (int)result[i];
                        if (this.Idx.Column[index].IndexOf(this.tbCol.Text) == -1)
                        {
                            result.RemoveAt(i);
                            continue;
                        }
                        i++;
                    }
                }
                return result;
            }

    2009年5月13日 12:43

答案

  • DataSet fDataSet = new DataSet();
    DataTable fDataTable = new DataTable("Table1");
    
    // 添加要显示的列
    fDataTable.Columns.Add("序号", typeof(String));
    fDataTable.Columns.Add("标题",typeof(String));
    fDataTable.Columns.Add("作者",typeof(String));
    fDataTable.Columns.Add("栏目",typeof(String));
    fDataTable.Columns.Add("年号", typeof(String));
    
    // 添加行
    for (int i = 0; i < this.Idx.File.Length; i++)
    {
        DataRow DrNewRow = null;
        DrNewRow = fDataTable.NewRow();
        DrNewRow[0] = i + 1;
        DrNewRow[1] = this.Idx.Title[i];
        DrNewRow[2] = this.Idx.Author[i];
        DrNewRow[3] = this.Idx.Column[i];
        DrNewRow[4] = this.Idx.YearVol[i];
    
        fDataTable.Rows.Add(DrNewRow);
    }
    
    fDataSet.Tables.Add(fDataTable);
    
    string filter = "";
    
    if (this.tbAuthor.Text != "")
    {
        filter += (filter == "" ? "" : " AND ") + string.Format("作者 = '{0}'", this.tbAuthor.Text);
    }
    
    if (this.tbColumn.Text != "")
    {
        filter += (filter == "" ? "" : " AND ") + string.Format("栏目 = '{0}'", this.tbColumn.Text);
    }
    
    if (this.tbTitle.Text != "")
    {
        filter += (filter == "" ? "" : " AND ") + string.Format("标题 = '{0}'", this.tbTitle.Text);
    }
    
    BindingSource fBindingSource = new BindingSource(fDataSet, "Table1");
    fBindingSource = filter;
    dataGridView1.DataSource = fBindingSource;
    试试
    知识改变命运,奋斗成就人生!
    2009年5月13日 14:45
    版主

全部回复

  • 为什么不把数据放到 DataTable 中呢,DataTable.Select 方法不是很方便吗?
    知识改变命运,奋斗成就人生!
    2009年5月13日 12:49
    版主
  • 这个是全文检索的代码.
                        IndexSearcher searcher = new IndexSearcher(this.AppStartPath + "\\index");
                        Query query = QueryParser.Parse(this.tbContent.Text, "contents", new StandardAnalyzer());
                        Hits hit = searcher.Search(query);
                        for (int j = 0; j < hit.Length(); j++)
                        {
                            Document doc = hit.Doc(j);
                            text = doc.Get("filename").ToString();
                        }
    2009年5月13日 12:52
  • 标题,栏目,正文 是从哪里来的?
    知识改变命运,奋斗成就人生!
    2009年5月13日 12:54
    版主
  • 我想到个办法,但是手头也没有索引文件(没有PDF),没法试。
    全文检索得到的结果doc.Get("filename"),如果让它显示出来,虽然是一条一条显示,但是实际上是多个值。
    正因为这个,才不知道下面的代码可行不可行。

                if(this.tbContent.Text!="")
                {
                    for (int i = 0; i < result.Count; )
                    {
                        index = (int)result[i];
                        IndexSearcher searcher = new IndexSearcher(this.AppStartPath + "\\index");
                        Query query = QueryParser.Parse(this.tbContent.Text, "contents", new StandardAnalyzer());
                        Hits hit = searcher.Search(query);
                        for (int j = 0; j < hit.Length(); j++)
                        {
                            Document doc = hit.Doc(j);
                            text = doc.Get("filename").ToString();
                        }
                        if(this.Idx.File[index].IndexOf(this.text)==1)
                        {
                            result.RemoveAt(i);
                            continue;
                        }
                        i++;
                    }
                }

    2009年5月13日 12:56
  • 感觉用正则要方便些,效率也要高些
    知识改变命运,奋斗成就人生!
    2009年5月13日 13:05
    版主
  • 你好:
           X.X.Y!

           标题和栏目信息都存放在数组当中,检索正文--就是在多篇PDF的正文中检索一个关键词,可能某一篇PDF的正文当中就有它。
          检索正文是用的lucene.net.

          "为什么不把数据放到 DataTable 中呢,DataTable.Select 方法不是很方便吗?"

           这个不也是进行匹配的吗?我还没用过呢。
           
          用这种方法比我上面的更简单吗?能大概讲讲吗?
         

    2009年5月13日 13:09
  • 根据上面所说的使用datatable.select,我想到1个办法,对全文检索得到后的信息都存放在一个datatable当中,然后再对标题,栏目进行筛选。是这个意思吗?

    2009年5月13日 13:13
  • 大概是这个意思,你是不是想做搜索引擎?
    知识改变命运,奋斗成就人生!
    2009年5月13日 13:14
    版主
  • 也不是做1个纯粹的搜索引擎。
    只是现在做的这个项目需要这一块功能。

    我刚才搜了一下datatable.select的用法,
    private void GetRowsByFilter()
    {
        DataTable table = DataSet1.Tables["Orders"];

        // Presuming the DataTable has a column named Date.
        string expression = "Date > '1/1/00'";

        // Sort descending by column named CompanyName.
        string sortOrder = "CompanyName DESC";
        DataRow[] foundRows;

        // Use the Select method to find all rows matching the filter.
        foundRows = table.Select(expression, sortOrder);

        // Print column 0 of each returned row.
        for(int i = 0; i < foundRows.Length; i ++)
        {
            Console.WriteLine(foundRows[i][0]);
        }
    }
    如果我要检索标题 a ,栏目 b ,这个条件该怎么写呢?

    2009年5月13日 13:25
  • DataTable fDataTable = new DataTable();
    
    fDataTable.Columns.Add(new DataColumn("FileName", typeof(String)));
    fDataTable.Columns.Add(new DataColumn("Title", typeof(String)));
    fDataTable.Columns.Add(new DataColumn("Content", typeof(String)));
    
    string fFileName = "文件名关键字";
    string fTitle = "标题关键字";
    string fContent = "内容关键字";
    
    // 一个条件
    string filter1 = string.Format("FileName = '{0}'", fFileName);
    DataRow[] fRows1 = fDataTable.Select(filter1);
    // 两个条件
    string filter2 = string.Format("FileName = '{0}' and Title = '{1}'", fFileName, fTitle);
    DataRow[] fRows2 = fDataTable.Select(filter2);
    // 三个条件
    string filter3 = string.Format("FileName = '{0}' and Title = '{1}' and Content = '{2}'", fFileName, fTitle, fContent);
    DataRow[] fRows3 = fDataTable.Select(filter3);
    大概是这样的,当然基于 SQL 的大部分语法都能用在这里
    知识改变命运,奋斗成就人生!
    2009年5月13日 13:31
    版主
  • 根据你的代码,我改成了自己要用的,不知道可行不?
    那个 1个条件 2个条件 3个条件 检索那一块,不太明白。
     比如:我可能只对标题检索,或者只对栏目检索。。。。
    也有可能对标题和栏目一起检索。
    改后的代码,有问题。输入条件,点检索按钮后就自动退出程序了。 
                // 定义一个dateset,用来与datagridview绑定
                DataSet dsCarData = new DataSet();

                // 定义datatable,存储要显示的相关信息,结构定义为你想显示在datagridview里的一样
                DataTable dt = new DataTable();

                // 添加要显示的列
                dt.Columns.Add("序号");
                dt.Columns.Add("标题",typeof(String));
                dt.Columns.Add("作者",typeof(String));
                dt.Columns.Add("栏目",typeof(String));
                dt.Columns.Add("年号");

                // 添加行
                DataRow DrNewRow = null;

                for (int i = 0; i < this.Idx.File.Length; i++)
                {
                    // 生成符合datatable结构的新行
                    DrNewRow = dt.NewRow();
                    DrNewRow[0] = i + 1 ;
                    DrNewRow[1] = this.Idx.Title[i];
                    DrNewRow[2] = this.Idx.Author[i];
                    DrNewRow[3] = this.Idx.Column[i];
                    DrNewRow[4] = this.Idx.YearVol[i];

                   dt.Rows.Add(DrNewRow);

                    string fAuthor = this.tbAuthor.Text;
                    string fColumn = this.tbColumn.Text;
                    string fTitle = this.tbTitle.Text;

                    // 一个条件
                    string filter1 = string.Format("标题 = '{1}'", fTitle);
                    DataRow[] fRows1 = dt.Select(filter1);
                    // 两个条件
                    string filter2 = string.Format("标题 = '{1}' and 作者 = '{2}'", fTitle, fAuthor);
                    DataRow[] fRows2 = dt.Select(filter2);
                    // 三个条件
                    string filter3 = string.Format("标题 = '{1}' and 标题 = '{2}' and 栏目 = '{3}'", fTitle, fAuthor, fColumn);
                    DataRow[] fRows3 = dt.Select(filter3);

                    // 将存有信息的新行加在datatable里
                  
                }
                // 将datatable加到dataset里
                dsCarData.Tables.Add(dt);
                // 数据绑定,这里面dataset的table指定的时候,可以指定index也可以把指定表名,因为只在dataset里添加了一个table,
                // 所以用index= 0去绑定
                dataGridView1.DataSource = dsCarData.Tables[0];

                this.Refresh();

    2009年5月13日 14:11
  • 写成这样,一输入条件,点击检索按钮还是得到的和输入条件检索前的数据是一样的
                    if(this.tbAuthor.Text!="")
                    {
                        DataRow[] rows = dt.Select("作者='"+this.tbAuthor.Text+"'");
                        rows = dt.Select("作者='" + this.tbAuthor.Text + "'");
                    }
                    if(this.tbColumn.Text!="")
                    {
                        DataRow[] rows = dt.Select("栏目='" + this.tbColumn.Text + "'");
                        rows = dt.Select("栏目='" + this.tbColumn.Text + "'");
                    }

                    if(this.tbTitle.Text!="")
                    {
                        DataRow[] rows = dt.Select("标题='" + this.tbTitle.Text + "'");
                        rows = dt.Select("标题='" + this.tbTitle.Text + "'");
                    }

    2009年5月13日 14:32
  • DataSet fDataSet = new DataSet();
    DataTable fDataTable = new DataTable("Table1");
    
    // 添加要显示的列
    fDataTable.Columns.Add("序号", typeof(String));
    fDataTable.Columns.Add("标题",typeof(String));
    fDataTable.Columns.Add("作者",typeof(String));
    fDataTable.Columns.Add("栏目",typeof(String));
    fDataTable.Columns.Add("年号", typeof(String));
    
    // 添加行
    for (int i = 0; i < this.Idx.File.Length; i++)
    {
        DataRow DrNewRow = null;
        DrNewRow = fDataTable.NewRow();
        DrNewRow[0] = i + 1;
        DrNewRow[1] = this.Idx.Title[i];
        DrNewRow[2] = this.Idx.Author[i];
        DrNewRow[3] = this.Idx.Column[i];
        DrNewRow[4] = this.Idx.YearVol[i];
    
        fDataTable.Rows.Add(DrNewRow);
    }
    
    fDataSet.Tables.Add(fDataTable);
    
    string filter = "";
    
    if (this.tbAuthor.Text != "")
    {
        filter += (filter == "" ? "" : " AND ") + string.Format("作者 = '{0}'", this.tbAuthor.Text);
    }
    
    if (this.tbColumn.Text != "")
    {
        filter += (filter == "" ? "" : " AND ") + string.Format("栏目 = '{0}'", this.tbColumn.Text);
    }
    
    if (this.tbTitle.Text != "")
    {
        filter += (filter == "" ? "" : " AND ") + string.Format("标题 = '{0}'", this.tbTitle.Text);
    }
    
    BindingSource fBindingSource = new BindingSource(fDataSet, "Table1");
    fBindingSource = filter;
    dataGridView1.DataSource = fBindingSource;
    试试
    知识改变命运,奋斗成就人生!
    2009年5月13日 14:45
    版主
  • fBindingSource = filter;
    错误 1 无法将类型“string”隐式转换为“System.Windows.Forms.BindingSource”
    2009年5月13日 15:10
  • fBindingSource.Filter = filter;

    知识改变命运,奋斗成就人生!
    2009年5月13日 15:11
    版主
  • 问题解决了,万分感谢啊!!!
    好像我的大部分问题都是你解决了,太谢谢了!
    那部分关键的检索代码,我自己再研究研究,实在不会了再问你哈。

    2009年5月13日 15:18
  • 嗯~休息了,byebye
    知识改变命运,奋斗成就人生!
    2009年5月13日 15:19
    版主
  • byebye

    2009年5月13日 15:25