首页 新闻 会员 周边

lucene 2.9.2.2 一个诡异的问题,不能搜索关键字"a",其他的可以

0
悬赏园豆:200 [已关闭问题] 关闭于 2011-09-20 11:31

添加索引代码:

public class IndexManage
{
public static void AddIndex(List<QuestionItem> itemList)
{
Analyzer analyzer
=new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29);
Lucene.Net.Store.FSDirectory fs
= Lucene.Net.Store.FSDirectory.Open(new DirectoryInfo("IndexDirectory"));
IndexWriter writer
=new IndexWriter(fs, analyzer,true,IndexWriter.MaxFieldLength.UNLIMITED);
foreach (var item in itemList)
{
AddDocument(writer, item);
}
writer.Commit();
writer.Optimize();
writer.Close();
}

private static void AddDocument(IndexWriter writer, QuestionItem item)
{
Document document
=new Document();
document.Add(
new Field("qid", item.QID.ToString(), Field.Store.YES, Field.Index.ANALYZED));
document.Add(
new Field("title", item.Title, Field.Store.YES,Field.Index.ANALYZED));
document.Add(
new Field("content", item.Content, Field.Store.YES, Field.Index.ANALYZED));
document.Add(
new Field("supply", item.Supply, Field.Store.YES, Field.Index.ANALYZED));
writer.AddDocument(document);
}
}

搜索代码:

public class SearchManage
{
public static List<QuestionItem> Search(string keyword)
{
Analyzer analyzer
=new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29);
Lucene.Net.Store.FSDirectory fs
= Lucene.Net.Store.FSDirectory.Open(new DirectoryInfo("IndexDirectory"));
IndexSearcher searcher
=new IndexSearcher(fs,true);
MultiFieldQueryParser parser
=new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29,new string[] { "title", "content","supply" }, analyzer);
parser.SetDefaultOperator(QueryParser.Operator.OR);
Query query
= parser.Parse(keyword);

var hits
= searcher.Search(query, 2500);
List
<QuestionItem> itemList =new List<QuestionItem>();
for (int i =0; i < hits.scoreDocs.Length; i++)
{
var doc
=searcher.Doc ( hits.scoreDocs[i].doc);
itemList.Add(
new QuestionItem() {
QID
=Int32.Parse(doc.Get("qid")),
Title
=doc.Get("title"),
Content
=doc.Get("content"),
Supply
=doc.Get("supply")
});
}
searcher.Close();
return itemList;
}
}

QuestionItem:
public class QuestionItem
{
public int QID { get;set; }
public string Title{get;set;}
public string Content { get; set; }
public string Supply { get; set; }
}

测试代码:
public static void Show()
{
AddIndex();
List
<QuestionItem> itemList = SearchManage.Search("a");
Console.WriteLine(
"search result:");
foreach (var item in itemList)
{
Console.WriteLine(item.QID
+""+ item.Title +""+ item.Content +""+ item.Supply);
}
}

private static void AddIndex()
{
List
<QuestionItem> itemList =new List<QuestionItem>() {
new QuestionItem(){QID=1,Title="a",Content="ab",Supply="abc"},
new QuestionItem(){QID=2,Title="b",Content="a",Supply="fds a"},
new QuestionItem(){QID=3,Title="c",Content="c defg",Supply="as dfg hjk"},
new QuestionItem(){QID=4,Title="d",Content="def a b",Supply="kjhgf ds a"},
new QuestionItem(){QID=5,Title="e",Content="ef ab c",Supply="a sdf g hjkl"}
};
IndexManage.AddIndex(itemList);
}

这里搜索"a",没有结果,但换为"ab","b","c"等就会有结果,非常诡异的问题,请教大侠。
artwl的主页 artwl | 专家六级 | 园豆:16736
提问于:2011-09-20 10:13
< >
分享
所有回答(1)
0

原因找到了,是Lucene中默认阻止了一些词的添加索跟搜索,而"a"刚好在这些默认阻止的词中,因此去掉这些词就OK了,把上面代码中的这一行:

Analyzer analyzer =new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29);

改为:

Hashtable ht =new Hashtable();
Analyzer analyzer
=new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29,ht);

就OK了,注意,添加索引中跟搜索里面的都要改哦:)。

artwl | 园豆:16736 (专家六级) | 2011-09-20 11:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册