首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

Lucene怎么进行查询

2012-12-17 
Lucene如何进行查询?最近在研究Lucene分词查询,仿照别人的例子写了一段代码,但是怎么也差不出数据,不知道

Lucene如何进行查询?
最近在研究Lucene分词查询,仿照别人的例子写了一段代码,但是怎么也差不出数据,不知道怎么回事,特地来请教大家


        Sort sortTaxis = new Sort(new SortField[] { new SortField("CGUID",SortField.STRING, true) });
        IndexSearcher search = new IndexSearcher("F:\\Index");
        int _n = search.MaxDoc();//这里可以看到加载是没有问题的,总记录数2000条
        BooleanQuery m_BooleanQuery = new BooleanQuery();
        //下面是自己加的两个查询条件
        if (this.txtAge.Text.Length>0)
        {
            QueryParser queryParser = new QueryParser("Age", new Lucene.Net.Analysis.KTDictSeg.KTDictSegAnalyzer(true));
            Query queryAge = queryParser.Parse(this.txtAge.Text);
            m_BooleanQuery.Add(queryAge, BooleanClause.Occur.MUST);//and操作
        }
        if (this.txtKeyWord.Text.Length>0)
        {
            string keyWord = GetKeyWordsSplitBySpaceTo(this.txtKeyWord.Text, new Lucene.Net.Analysis.KTDictSeg.KTDictSegTokenizer());
            keyWord = StrReplaceSymbol(keyWord);
            QueryParser queryParser = new QueryParser("Name", new Lucene.Net.Analysis.KTDictSeg.KTDictSegAnalyzer(true));
            Query query = queryParser.Parse(keyWord);
            m_BooleanQuery.Add(query, BooleanClause.Occur.MUST);//and操作
        }
        Hits hits = search.Search(m_BooleanQuery, sortTaxis);//查询并得到结果
        int recCount = hits.Length();//查询结果为0
       //........

无论我的查询条件加或者不加,始终是查询不到数据,代码也不报错,请问我的代码哪里有问题啊?
[最优解释]
private Hits seacher(string flg, string lib)
    {
        Hits hits = null;
        try
        {
            BooleanQuery bq = new BooleanQuery();

            IndexSearcher search = RCH.Lucene.LuceneIndex.createsearcher("D:\\WebIndex\\Index_Risk\");

            if (flg != "")
            {
                if (rbBt.Checked)
                {
                    string keywords = RCH.Lucene.LuceneAnalyzer.pangukeys(flg, RCH.Lucene.LuceneAnalyzer.pangu_tokenizer());


                    QueryParser title_QueryParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "doc_flg", new PanGuAnalyzer(true));
                    Query title_Query = title_QueryParser.Parse(keywords);
                    bq.Add(title_Query, BooleanClause.Occur.MUST);
                }
                else
                {
                    string keywords = RCH.Lucene.LuceneAnalyzer.pangukeys(flg, RCH.Lucene.LuceneAnalyzer.pangu_tokenizer());
                    QueryParser title_QueryParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "doc_info", new PanGuAnalyzer(true));
                    Query title_Query = title_QueryParser.Parse(keywords);
                    bq.Add(title_Query, BooleanClause.Occur.MUST);
                }
            }
            QueryParser type_QueryParser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "doc_library", new PanGuAnalyzer(true));
            Query type_Query = type_QueryParser.Parse(lib);


            bq.Add(type_Query, BooleanClause.Occur.MUST);

            hits = search.Search(bq);
        }
        catch
        {
            Response.Write("搜索失败!");
        }
        return hits;
    }


这是我的代码   可以用。。。你自己对比下吧     
[其他解释]
demo
http://www.codeproject.com/Articles/30261/Lucene-net-in-asp-net-simple-example
[其他解释]
你索引创建成功了么?
[其他解释]
是成功了的,int _n = search.MaxDoc();//这里可以看到加载是没有问题的,总记录数2000条
引用:
你索引创建成功了么?

[其他解释]
生成代码如下

              DataTable dt = SqlHelper.ExecuteDataTable(CommandType.Text, "SELECT top 2000 * From Customer");


                //生成的索引路径
                string indexDirectory = ConfigurationManager.AppSettings["IndexDir"];
                //定义分析器 
                Analyzer KTDictSegAnalyzer = new Lucene.Net.Analysis.KTDictSeg.KTDictSegAnalyzer();
                //创建IndexWriter 
                IndexWriter writer = new IndexWriter(indexDirectory, KTDictSegAnalyzer, true);
                if (dt != null && dt.Rows.Count > 0)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        Document document = new Document();
                        document.Add(new Field("cguid", dt.Rows[i]["cguid"].ToString(), Field.Store.YES, Field.Index.TOKENIZED));
                        document.Add(new Field("name", dt.Rows[i]["name"].ToString(), Field.Store.YES, Field.Index.TOKENIZED));
                        document.Add(new Field("bankcard", dt.Rows[i]["bankcard"].ToString(), Field.Store.YES, Field.Index.TOKENIZED));
                        document.Add(new Field("age", dt.Rows[i]["age"].ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED));
                        //设置权重,权重值越高,排序越靠前
                        document.SetBoost(1.0f);
                        try
                        {
                            writer.AddDocument(document);//写入数据
                        }
                        catch (Exception ex)
                        {



                        }
                    }
                }
                writer.Optimize();
                writer.Close();
                dt.Dispose();


[其他解释]
好像我的版本和你的不一样,你的代码复制过来都不能用。
引用:
C# code?



12345678910111213141516171819202122232425262728293031323334353637383940

private Hits seacher(string flg, string lib)     {         Hits hits = null;         try        {            ……

[其他解释]
 看下存放索引的文件路径对不对       我表示我的成功了   
[其他解释]
问题终于解决了,原来是因为大小写问题,生成索引文件时字段大小写是什么样的,在查询时必须也要一样,不然就查不到,而且Lucene查询时必须要传一个或多个查询条件。多谢各位!

热点排行