数据表内容:
id content
1 言归正传,为什么要把web服务器与数据库分开放置呢?
2 数据库配置该如果进行
3 服务器该怎么防攻击?
我采用的是射日分词分析器建立索引和搜索的。当我搜索关键词: 数据库 结果id为 1,2
当我搜索关键词: 数据库 服务器 结果id为 1,2, 3
当我搜索关键词: 数据库服务器 结果id为 空
当我搜索关键词: 服务器数据库 结果id为 空我插了下搜索关键词的拆分,服务器数据库和数据库服务器都能拆分为2个关键词:数据库 服务器
为什么却搜索不出结果1,2,3呢?
id content
1 言归正传,为什么要把web服务器与数据库分开放置呢?
2 数据库配置该如果进行
3 服务器该怎么防攻击?
我采用的是射日分词分析器建立索引和搜索的。当我搜索关键词: 数据库 结果id为 1,2
当我搜索关键词: 数据库 服务器 结果id为 1,2, 3
当我搜索关键词: 数据库服务器 结果id为 空
当我搜索关键词: 服务器数据库 结果id为 空我插了下搜索关键词的拆分,服务器数据库和数据库服务器都能拆分为2个关键词:数据库 服务器
为什么却搜索不出结果1,2,3呢?
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);
至于你的搜索结果,应该是这个分词组件对关键字进行最大匹配的原因吧。
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);