lucene 2.9.2.2 一个很奇怪的问题,无法搜索关键字“a”,其他可以

发布于 2024-12-05 10:33:29 字数 3653 浏览 1 评论 0原文

添加索引代码:

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”有结果,一个很奇怪的问题,谁能帮助我?

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)
        {
            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 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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

命比纸薄 2024-12-12 10:33:29

StandardAnalyzer 使用默认停用词列表,其中一个是“a”。如果您不需要停用词,您可以使用带有空集作为第二个参数的构造函数:

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

或者在 .net 中如下所示:

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

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());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文