无论搜索词是什么,Lucene都会返回相同的搜索结果

时间:2010-02-13 08:44:26

标签: c# lucene.net

这是我的代码

term = Server.UrlDecode(term);
        string indexFileLocation = "C:\\lucene\\Index\\post";
        Lucene.Net.Store.Directory dir =
            Lucene.Net.Store.FSDirectory.GetDirectory(indexFileLocation, false);


        //create an index searcher that will perform the search
        Lucene.Net.Search.IndexSearcher searcher = new
        Lucene.Net.Search.IndexSearcher(dir);

        //build a query object
        Lucene.Net.Index.Term searchTerm =
          new Lucene.Net.Index.Term("post_title", term);

        Lucene.Net.Analysis.Standard.StandardAnalyzer analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer();

        Lucene.Net.QueryParsers.QueryParser queryParser = new
Lucene.Net.QueryParsers.QueryParser("post_title", analyzer);

        Lucene.Net.Search.Query query = queryParser.Parse(term);



        //execute the query
        Lucene.Net.Search.Hits hits = searcher.Search(query);

        List<string> s = new List<string>();

        for (int i = 0; i < hits.Length(); i++)
        {
            Lucene.Net.Documents.Document doc = hits.Doc(i);
            s.Add(doc.Get("post_title_raw"));
        }

        ViewData["s"] = s;

这是我的索引代码

        //create post lucene index
        LuceneType lt = new LuceneType();
        lt.Analyzer = new Lucene.Net.Analysis.Standard.StandardAnalyzer();
        lt.Writer = new Lucene.Net.Index.IndexWriter("C:/lucene/Index/post", lt.Analyzer, true);

        using (var context = new MvcApplication1.Entity.test2Entities())
        {
            var posts = from p in context.post
                        where object.Equals(p.post_parentid, null) && p.post_isdeleted == false
                        let Answers = from a in context.post
                                      where a.post_parentid == p.post_id
                                      select new
                                      {
                                          a.post_description
                                      }
                        let Comments = from c in context.comment
                                      where c.post.post_id == p.post_id
                                      select new
                                      {
                                          c.comment_text
                                      }
                        select new
                        {
                            p,
                            Answers,
                            Comments
                        };


            foreach (var post in posts)
            {
                //lets concate all the answers and comments
                StringBuilder answersSB = new StringBuilder();
                StringBuilder CommentsSB = new StringBuilder();
                foreach (var answer in post.Answers)
                    answersSB.Append(answer.post_description);
                foreach (var comment in post.Comments)
                    CommentsSB.Append(comment.comment_text);



                //add rows
                lt.Doc.Add(new Lucene.Net.Documents.Field(
                    "post_id",
                    post.p.post_id.ToString(),
                    Lucene.Net.Documents.Field.Store.YES,
                    Lucene.Net.Documents.Field.Index.UN_TOKENIZED
                    ));

                lt.Doc.Add(new Lucene.Net.Documents.Field(
                    "post_title",
                    new System.IO.StringReader(post.p.post_title)));

                lt.Doc.Add(new Lucene.Net.Documents.Field(
                    "post_title_raw",
                    post.p.post_title,
                    Lucene.Net.Documents.Field.Store.YES,
                    Lucene.Net.Documents.Field.Index.UN_TOKENIZED));

                lt.Doc.Add(new Lucene.Net.Documents.Field(
                    "post_titleslug",
                    post.p.post_titleslug,
                    Lucene.Net.Documents.Field.Store.YES,
                    Lucene.Net.Documents.Field.Index.UN_TOKENIZED));

                lt.Doc.Add(new Lucene.Net.Documents.Field(
                    "post_tagtext",
                    new System.IO.StringReader(post.p.post_tagtext)));

                lt.Doc.Add(new Lucene.Net.Documents.Field(
                    "post_tagtext",
                    post.p.post_tagtext,
                    Lucene.Net.Documents.Field.Store.YES,
                    Lucene.Net.Documents.Field.Index.UN_TOKENIZED));

                lt.Doc.Add(new Lucene.Net.Documents.Field(
                    "post_description",
                    new System.IO.StringReader(post.p.post_description)));

                lt.Doc.Add(new Lucene.Net.Documents.Field(
                    "post_description_raw",
                    post.p.post_description,
                    Lucene.Net.Documents.Field.Store.YES,
                    Lucene.Net.Documents.Field.Index.UN_TOKENIZED));


                lt.Doc.Add(new Lucene.Net.Documents.Field(
                    "post_Answers",
                    new System.IO.StringReader(answersSB.ToString())));


                lt.Doc.Add(new Lucene.Net.Documents.Field(
                    "post_Comments",
                    new System.IO.StringReader(CommentsSB.ToString())));

            }
            lt.Writer.AddDocument(lt.Doc);
            lt.Writer.Optimize();
            lt.Writer.Close();

为什么这会为任何搜索字词返回相同的重复数据?

3 个答案:

答案 0 :(得分:0)

Lucene.Net.Search.Query query = queryParser.Parse(term);

在上面的代码而不是 searchterm 中,您使用了 term

您的代码必须如下所示

Lucene.Net.Search.Query query = queryParser.Parse(searchterm);

答案 1 :(得分:0)

您可以进行一些小改动,如下所示

//构建一个查询对象         Lucene.Net.Index.Term searchTerm =           新的Lucene.Net.Index.Term(“post_title”,术语);

TermQuery tq = new TermQuery(searchTerm);

...

...

Lucene.Net.Search.Query query = tq;

现在不需要Parser。

如果仍然需要解析器,那么您可以将上面的行更改为

Lucene.Net.Search.Query query = queryParser.Parse(tq.ToString());

希望这有帮助。

答案 2 :(得分:0)

不是直接答案,而是获取LUKE(它也适用于.NET索引)并打开索引 - 尝试使用正确类型的优化器来使用它的查询器。如果可行,您知道问题出在您的查询中。如果没有,它既可以在索引和查询中,但至少应该让你走上正确的轨道。