今天用lucene.net做了个简单的站内搜索
发现比数据库用like快了好多倍,用like要15秒
用lucene.net只要0.095秒
本机数据库数据只有10万,通过lucene.net建立索引要56M
不过我建索引是通过手动建的
我想问的是建立索引是自己特定时间建索引,然后当数据更新到一定量的时候在删除索引重新建
还是该怎么建呢?网上找了下没相关资料,倒是怎么建索引讲了好多
希望各位兄弟不要从网上复制给我该怎么建索引的,这个我会了
先谢谢大家了

解决方案 »

  1.   

    http://www.cnblogs.com/onlytiancai/archive/2006/10/16/529980.html
      

  2.   

    http://www.cnblogs.com/AspxCC/articles/1751596.html 
      

  3.   

    目前我也在做这个,还不会。那个盘古分词比Lucent.net好些。
      

  4.   

    还有个问题就是
    怎么对标题和内容进行搜索呢?还有就是像baidu google一样,
    例如搜索童 装中间有个空格,他会把相关信息搜索出来!
    我做了下做不出来,搜索0条记录。发现网上例子太少了。求会的帮帮忙!
      

  5.   

    (wien 维也纳) 的方法不错。还有就是你可以做增量索引。比如你改变了某条记录,做个触发器记录这个ID,然后只针对改变过的信息做增量索引。这样记录少很多。
      

  6.   

    还有个问题就是
    怎么对标题和内容进行搜索呢?
    BooleanQuery 
      

  7.   

    恩!我今天就是用了这个,本来是这样做的
     
    QueryParser qp = new QueryParser("title", new ChineseAnalyzer());
    Query query = qp.Parse(keywords);然后改成
    BooleanQuery query = new BooleanQuery();
    Query query1 = new TermQuery(new Term("title", keywords)); 
    query.Add(query1, BooleanClause.Occur.MUST);
    Hits hits = searcher.Search(query);
    这样我输入童装搜索结果搜索不出来,网上看了下也有人问到TermQuery不支持中文分词,不知道如何解决。
    还有我想对标题和内容进行搜索
    是要用多字段MultiFieldQueryParser 
    还是用多条件QueryParser.Parse?
      

  8.   

    终于解决了代码如下:protected void Page_Load(object sender, EventArgs e)
        {
            Test();
            Lucene.Net.Search.IndexSearcher search = new Lucene.Net.Search.IndexSearcher(@"E:\1\index"); //把刚才建立的索引取出来
            Lucene.Net.Search.Query q = Lucene.Net.QueryParsers.QueryParser.Parse("搜索关键字", "intr", new Lucene.Net.Analysis.Standard.StandardAnalyzer());
            Lucene.Net.Search.Hits hit = search.Search(q);
            lb.Items.Clear();    //lb是我测试程序中的一个 listbox        for (int i = 0; i <= hit.Length() - 1; i++)
            {
                lb.Items.Add(hit.Doc(i).GetField("bookname").StringValue());
            }
        }
        public void Test()
        {
            Lucene.Net.Analysis.Standard.StandardAnalyzer a = new Lucene.Net.Analysis.Standard.StandardAnalyzer();
            IndexWriter iw = new IndexWriter(@"E:\1\index", a, true);   //E:\1\index  为索引文件存放地址
            string conn = "数据库连接字符串";
            using (DataTable dt = SqlHelper.ExecuteDataset(conn, CommandType.Text, "Select top 100 name,Intr from book ").Tables[0])
            {
                foreach (DataRow dr in dt.Rows)
                {
                    IndexBook(dr["name"].ToString(), dr["intr"].ToString(), iw); // 这是关键
                }        }
            iw.Optimize();
            iw.Close();    }
        private void IndexBook(string bookname, string bookintr, IndexWriter writer)
        {
            try
            {
                Document doc = new Document();
                doc.Add(Field.Keyword("bookname", bookname));
                doc.Add(Field.Text("intr", bookintr));            writer.AddDocument(doc);
            }        catch (FileNotFoundException fnfe)
            {        }
        }