Daily Report 2012/11/05 陈伯雄(step 6)
今天的工作主要是把昨天修改的设计方案的框架搭建出来:给数据库建一个倒排索引(这部分应该在pipe组实现搭建数据库之后立即执行,在数据更新前只需运行一次),当用户使用search功能时,调用match函数进行匹配,分局匹配程度返回一个区分优先级的ARRAYLIST,作为变量给呈现部分模块。
以下是新设计的基本框架(中文分词,match部分尚未完成,部分sql语句有待修改):
1 static void Main(string[] args) 2 { 3 List<Result> resultList = new List<Result>(); 4 string connectionString = GetConnectionString(); //SQL Server链接字符串 5 using (SqlConnection connection = new SqlConnection(connectionString)) //SQL链接类的实例化 6 { 7 connection.Open(); //打开数据库 8 //建立倒排表 9 string sqlstr = "CREATE table index3(key varchar(50) primary key, ID varchar(50))"; 10 SqlCommand cmd = new SqlCommand(); 11 cmd.Connection = connection; 12 cmd.CommandText = sqlstr; 13 cmd.ExecuteNonQuery(); 14 //读取顺序表 15 sqlstr = "SELECT * FROM DOC,PDF,VEDIO,QAPAIR"; 16 cmd.CommandText = sqlstr; 17 SqlDataReader reader = cmd.ExecuteReader(); //它的返回类型为SqlDataReader。此方法用于用户进行的查询操作。使用SqlDataReader对象的Read();方法进行逐行读取。 18 try 19 { 20 while (reader.Read()) 21 { 22 string title = reader["title"].ToString(); 23 string keyword = reader["keyword"].ToString(); 24 string ID = reader["ID"].ToString(); 25 //分词处理 26 string[] words = getWords(title, keyword); 27 //将keyword信息添加到倒排表 28 foreach (string word in words) 29 { 30 //暂时缺一个判断条件(未完成) 31 32 //倒排索引中存在的关键词,加上属性ID信息 33 cmd.CommandText = "SELECT value FROM index3 WHERE value = word"; 34 string newValue = cmd.ExecuteScalar().ToString() + "," + ID; 35 cmd.CommandText = "UPDATE index3 SET value = newValue WHERE key = word"; 36 cmd.ExecuteNonQuery(); 37 38 //倒排表中加入新关键词 39 cmd.CommandText = "INSERT INTO index3 VALUES(word, ID)"; 40 cmd.ExecuteNonQuery(); 41 } 42 } 43 } 44 finally 45 { 46 // Always call Close when done reading. 47 reader.Close(); 48 } 49 //匹配(未完成) 50 match(); 51 connection.Close(); //关闭数据库 52 } 53 } 54 55 static private string GetConnectionString() 56 { 57 // To avoid storing the connection string in your code, 58 // you can retrieve it from a configuration file, using the 59 // System.Configuration.ConfigurationSettings.AppSettings property 60 return "Data Source=.;Initial Catalog=FILE;Integrated Security=SSPI;"; //SQL Server链接字符串,本地测试用 61 } 62 63 //分词(未完成) 64 static private string[] getWords(string title, string keyword) 65 { 66 string str = title + " " + keyword; 67 string[] wordList = str.Split(new char[2] { ' ', ':' }, StringSplitOptions.RemoveEmptyEntries); 68 return wordList; 69 } 70 71 static private void match() 72 { 73 74 }
明天将具体实现分词功能,等待match部分的实现再对其进行嵌入。