【问题标题】:Lucene.net does not find matches correctlyLucene.net 无法正确找到匹配项
【发布时间】:2016-01-22 19:55:16
【问题描述】:

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

现在我无法修复代码中的错误。

让我在代码中解释一下

首先我创建这样的索引

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

我自己认为索引没问题,因为我只想找到 restaurant 名称和 addresses

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

     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") 结果是好的。

怎么办呢

【问题讨论】:

    标签: c# lucene.net


    【解决方案1】:

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

    如果您需要对所有查询执行此操作 - 您需要检查您的选择 - 因为 Lucene 使用全词搜索的效果最好。原因是默认情况下通配符会变成恒定分数查询,而术语搜索使用相关性对结果进行排名。

    【讨论】:

    • 非常感谢@Giedrius,你能解释一下吗?
    • 我需要在代码中播种才能理解
    • 自从我使用 Lucene 已经有一段时间了,但是如果我没记错的话,只需将查询写成 box* 就可以得到你想要的结果。如果您不希望强制用户写 *,您可以自己附加它,如此答案:stackoverflow.com/a/5747425/212121
    • 非常感谢@Giedrius,请问您有lucene支持通配符的版本吗?
    • 从我在这里读到的内容:wiki.apache.org/lucene-java/… 它应该在 2.1 之后的版本中得到支持。
    猜你喜欢
    • 1970-01-01
    • 2019-02-10
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    相关资源
    最近更新 更多