数据表内容:
id      content
1       言归正传,为什么要把web服务器与数据库分开放置呢?
2       数据库配置该如果进行
3       服务器该怎么防攻击?
我采用的是射日分词分析器建立索引和搜索的。当我搜索关键词: 数据库              结果id为 1,2
当我搜索关键词: 数据库 服务器       结果id为 1,2, 3
当我搜索关键词: 数据库服务器        结果id为 空
当我搜索关键词: 服务器数据库        结果id为 空我插了下搜索关键词的拆分,服务器数据库和数据库服务器都能拆分为2个关键词:数据库 服务器
为什么却搜索不出结果1,2,3呢?

解决方案 »

  1.   

    IndexWriter = new IndexWriter(INDEX_STORE_PATH, new ShootAnalyzer(), true);
    SqlDataReader myred = ExecuteQuery("select id,content from article");
    while (myred.Read())
          {
              Document doc = new Document();
              doc.Add(new Field("id", myred["id"].ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED));
              doc.Add(new Field("content",myred["content"].ToString(), Field.Store.NO, Field.Index.TOKENIZED));
              writer.AddDocument(doc);
          }
         myred.Close();
         myred.Dispose();     writer.Optimize();
         writer.Close();搜索处主要代码:
    IndexSearcher mysearch = new IndexSearcher(INDEX_STORE_PATH);
    QueryParser q = new QueryParser("content", new ShootAnalyzer());
    Query query = q.Parse(keyword);
    Hits myhit = mysearch.Search(query);
      

  2.   

    lucene.net的中文分词器一般都用盘古,或者官方的中文分词器,这个射日没听过。。
    至于你的搜索结果,应该是这个分词组件对关键字进行最大匹配的原因吧。
    lucene的搜索是把用户的输入当作一篇文档(而不是一个关键词),它的搜索打分的过程是对两篇文档(用户输入的内容和索引中的文档)的关联、相似程度进行打分。所以我们知道,搜索和创建索引的过程一样,也会对用户输入的内容进行词法分析,另外搜索时还会有语法分析。
    像你的这种情况,当用户输入的内容包含空格的时候,lucene会自动把它当成用空格分隔的多个词,这是语法分析的作用。如果不包含空格,你就要让searcher知道这是一篇要经过分词的文档,而不能当它是一个长词语。
    拿盘古来说:QueryParser queryParser = new QueryParser("contents", new PanGuAnalyzer(true));
    string q = GetKeyWordsSplitBySpace(keywords, new PanGuTokenizer());
    Query query = queryParser.Parse(q);你的情况是:QueryParser q = new QueryParser("content", new ShootAnalyzer());
    Query query = q.Parse(keyword);