Lucene.net未找到匹配项

时间:2016-01-22 19:55:17

标签: c# lucene.net

我是lucene.net的新手,在我的一些搜索中,我发现我可以在我的项目中使用lucene,

现在我无法解决代码中的错误。

让我在Code

中解释一下

首先,我创建像这样的索引

        var strIndexDir = path;
        Directory indexDir = FSDirectory.Open(new DirectoryInfo(strIndexDir));
        Analyzer std = new StandardAnalyzer(global::Lucene.Net.Util.Version.LUCENE_30)

     foreach (var res in resturant)
        {

            var doc = new Document();

          restaurantName = new Field("Name",
                res.Name, Field.Store.YES,
                Field.Index.ANALYZED, Field.TermVector.YES);
            var restaurantId = new Field("Id",
                res.RestaurantId.ToString(), Field.Store.YES,
                Field.Index.NO, Field.TermVector.NO);
            var restaurantSlug = new Field("Slug",
                res.Slug, Field.Store.YES,
                Field.Index.NO, Field.TermVector.NO);
            var restaurantAddress = new Field("Address",
                res.Address ?? "empty", Field.Store.YES,
                Field.Index.NOT_ANALYZED, Field.TermVector.YES);
            var resturantType = new Field("Type",
                "restaurant", Field.Store.YES,
                Field.Index.NO, Field.TermVector.NO);
            doc.Add(restaurantName);
            doc.Add(restaurantId);
            doc.Add(restaurantSlug);
            doc.Add(restaurantAddress);
            doc.Add(resturantType);

            idxw.AddDocument(doc);
        }
        idxw.Optimize();
        idxw.Close();

我认为索引是好的,因为我想找到餐厅名称和地址

也用于搜索查询我用这种方式

     string strIndexDir = path;
        Analyzer std = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30);




     var indexReader = IndexReader.Open(FSDirectory.Open(path), readOnly: true);
        var parserName =
        new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Name", std);
        var parserAddress =
          new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Address", std);
        var parserSlug =
          new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Slug", std);
        var parserTitle =
          new Lucene.Net.QueryParsers.QueryParser(Lucene.Net.Util.Version.LUCENE_30, "Title", std);
        var searcher = new IndexSearcher(FSDirectory.Open(path));

        using (var srchr = new IndexSearcher(IndexReader.Open(directory,true)))
        {


            var qryName = parserName.Parse(q);
            var qryAddress = parserAddress.Parse(q);
            var qrySlug = parserSlug.Parse(q);
            var qrytitle = parserTitle.Parse(q);
            var cllctr = TopScoreDocCollector.Create(10, true);
            searcher.Search(qryName, cllctr);
            searcher.Search(qryAddress, cllctr);
            searcher.Search(qrySlug, cllctr);
            searcher.Search(qrytitle, cllctr);
            var hits = cllctr.TopDocs().ScoreDocs;

现在让我说一下问题在哪里。

例如我搜索这个关键词(q =“box”)想要找到名称为boxshaharkgharb的餐馆名称并想要使用“box”

问题是hot总是0但是当我输入boxshaharkgharb例如(q =“boxshaharkgharb”)时结果还可以。

handel怎么样

1 个答案:

答案 0 :(得分:1)

通过使用通配符*,您可以强制Lucene按片段进行搜索。

如果您需要对所有查询执行此操作 - 您需要检查您的选择 - 因为Lucene使用整个术语搜索表现最佳。原因是,默认情况下,通配符会变为常量分数查询,而术语搜索会使用相关性对结果进行排名。