开发者

lucene 2.9.2.2 A very strange problem, can not search for the keyword "a", the other can

add index code:

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);
    }
}

search code:

public class SearchManage
    {
        public static List<QuestionItem> Search(string keyword)
        {
            Ana开发者_开发百科lyzer 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 model is:

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

Test code is:

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);
}

now the problem is : search "a", no results, but for the "ab", "b", "c" have outcome ,a very strange problem, who can help me?


StandardAnalyzer uses a list of default stop words of which one is 'a'. If you didn't want stop words you could use the constructor with an empty set as the second argument:

Analyzer ana = new StandardAnalyzer(LUCENE_30, Collections.emptySet());

or in .net like this:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜