本帖最后由 u012076966 于 2013-09-10 22:01:03 编辑

解决方案 »

  1.   

    增加、修改、删除 和创建基本一样,需要注意的是:
    //第三个参数要为:false,我注释里面也有些,如果仔细看
      writer = new IndexWriter(IndexDic, PanGuAnalyzer, false, Lucene.Net.Index.IndexWriter.MaxFieldLength.LIMITED);
    /* 第二个注意是调用函数不一样我分别写出来 */
     //添加一条新的索引
         writer.AddDocument(doc);
     //修改一条索引
         Term term = new Term("No", No);
         writer.UpdateDocument(term, doc);
     //删除一条索引
         Term term = new Term("No", No);
          writer.DeleteDocuments(term);看了是不是挺简单,接下来就是 查询了
      

  2.   

    生成索引是比较麻烦的。
    我原来那个用的是ShootAnalyzer的分词,每周生成一次索引(要不然有的新的关键词原分词系统里面没有的就检索不到)。
      

  3.   

    当时大概几个G的HTML静态文件(具体多少G记不清了),生成索引以后大概在700M左右。
      

  4.   

    是啊,不过自带分词我感觉最好用的就是:SimpleAnalyzer()可以按标点符号分词,这样对我前端属性搜索非常便利,盘古分词真心不行,不知道大侠们有办法没(比如:无线上网,停车位,外送),盘古分词可以按标点符号分词最好了
      

  5.   

    忘记增加了一个索引字段:
    //当WEB前端搜索显示全部索引库数据时候,我网上找资料好像没有很的好解决方案,都是在做索引的时候增加一个特殊字段索引或其他,我就是利用增加一个特殊字段索引,当用户搜索显示全部数据时候,传入参数:alllist 就能查询出所有索引库数据,如果有更好办法请告知下,这里先谢了。
     doc.Add(new Field("AllList", "alllist", Field.Store.YES, Field.Index.NOT_ANALYZED));
      

  6.   

    是啊,不过自带分词我感觉最好用的就是:SimpleAnalyzer()可以按标点符号分词,这样对我前端属性搜索非常便利,盘古分词真心不行,不知道大侠们有办法没(比如:无线上网,停车位,外送),盘古分词可以按标点符号分词最好了
    我当时那个是针对静态HTML文件做的全文检索。
    当时有HTML、分词库、索引库、索引建立更新程序(winform)、搜索功能(webform)组成,基本没涉及到数据库。流程是先用winform读取分词库来给所有的html建立索引库,然后搜索的时候根据用户传递过来的关键字返回符合关键字的html的url路径。所以这个分词库需要每周更新(没法做到那么智能,会自动区分关键字),每周更新索引。更新索引的时间比较长(4-6G大概需要4个小时左右(单线程))。我这方法是最笨的方法,当时也是百度不到文档,自己扣出来的。最终总算是实现了。不过现在像百度和google都带的有站内搜索,用着还是比较方便的。引用一个js就行了。
      

  7.   

    分享一些简单lucene.net属性说明整理了下,很简单,凭着分享精神 不收积分,哈哈。顺带附上了盘古分词的维护工具
    http://download.csdn.net/detail/u012076966/6247193
      

  8.   

    楼主好人啊,这个lucene现在不开源了吧。
      

  9.   

    /* ----------------===============简单搜索============--------------- */ 
    /// <summary>
            /// 加载绑定数据
            /// </summary>
            protected void Bind()
            {
       
                    string Name = txtName.Text;
            string Alllist="1";//URL传值
                    //价格区间查询
                    string PriceStart = txtStart.Text;
                    string PriceEnd = txtEnd.Text;
                    Hits myhit = null;
            //IndexDic 索引配置文件,上面已发
                    IndexSearcher mysea = new IndexSearcher(IndexDic);                //SortField构造函数第三个字段true为降序,false为升序
                    string strListDesc = ddlOrder.SelectedValue;//排序字段
                    Sort sort = null;
                   //排序字段 price
                    if (strListDesc == "1")
                    {
                        sort = new Sort(new SortField("price", SortField.AUTO, false));
                    }
                    else
                    {
                        sort = new Sort(new SortField("price", SortField.AUTO, true));
                    }
                         BooleanQuery booleanQuery = new BooleanQuery();
                    TermQuery termNO = null;
                    TermQuery termAllList= null;                //查询所有
                   if(Alllist=="1")
            {

                            termAllList= new TermQuery(new Term("AllList", "alllist"));
                       
                        booleanQuery.Add(termAllList , BooleanClause.Occur.MUST);
                  }
                   //按盘古分词查询
                   if(Name!="")
                    {
                        Name  = GetKeyWordsSplitBySpace(Name);
                        QueryParser parse = new QueryParser("Name", PanGuAnalyzer);
                        Query query = parse.Parse(Name);
                        parse.SetDefaultOperator(QueryParser.Operator.OR);
                        booleanQuery.Add(query, BooleanClause.Occur.MUST);
                    }
     
                    Filter filter = null;
                    //价格 区间查询
                    if (PriceStart != "" && PriceEnd != "")
                    {
                        float fspc = float.Parse(PriceStart);
                        float fepc = float.Parse(PriceEnd );                    booleanQuery.Add(NumericRangeQuery.NewFloatRange("Price", fspc, fepc, true, true), BooleanClause.Occur.MUST);
                    }
                
            
                    //分页我使用的是 第三方分页控件
                    TopDocs docs = mysea.Search(booleanQuery, filter, AspNetPager1.StartRecordIndex + AspNetPager1.PageSize - 1, sort);
                    AspNetPager1.RecordCount = docs.totalHits;
                    if (docs != null && docs.totalHits > 0)
                    {
                      
                        DataRow myrow;
                        DataTable mytab = new DataTable();
        
                        mytab.Columns.Add("No");
                        mytab.Columns.Add("Name");
                        mytab.Columns.Add("Price1");
                        mytab.Clear();
                        for (int i = 0; i < docs.totalHits; i++)
                        {
                            //分页读取数据
                            if (i >= AspNetPager1.StartRecordIndex - 1 && i < AspNetPager1.StartRecordIndex + AspNetPager1.PageSize - 1)
                            {
                                Document doc = mysea.Doc(docs.scoreDocs[i].doc);
                                myrow = mytab.NewRow();
                                #region 给DataTable每行赋值根据DataRow
                                myrow[0] = doc.Get("No").ToString();
                                myrow[1] = doc.Get("Name").ToString();
                                myrow[2] = doc.Get("Price1").ToString();
                                #endregion
                                mytab.Rows.Add(myrow);
                                myrow.AcceptChanges();
                            }
                        }
                        //绑定数据控件
            rp_Item.DataSource=mytab;
                        rp_Item.DataBind();
                      
                        mysea.Close();
                
                    }
            }
     /// <summary>
            /// 处理关键字为索引格式
            /// </summary>
            /// <param name="keywords"></param>
            /// <returns></returns>
            private string GetKeyWordsSplitBySpace(string keywords)
            {
                PanGuTokenizer ktTokenizer = new PanGuTokenizer();
                StringBuilder result = new StringBuilder();
                ICollection<WordInfo> words = ktTokenizer.SegmentToWordInfos(keywords);
                foreach (WordInfo word in words)
                {
                    if (word == null)
                    {
                        continue;
                    }
                    result.AppendFormat("{0}^{1}.0 ", word.Word, (int)Math.Pow(3, word.Rank));
                }
                return result.ToString().Trim();
            }
      

  10.   

    感谢分享,建议写到个人的blog里面
      

  11.   

    简单把,基本上结束了。有空整理个小DEMO ,其实好多也是我拿别人的,直接用的,这里谢谢那些大虾们
      

  12.   

     LZ,你好啊!我用的也是盘古分词,但是搜索有些单个字的时候查出来的数据不完整,您能帮我分析一下吗?
    QQ:237377144,  谢谢LZ