现场提升不起作用/效果Lucene.net

时间:2016-05-10 08:33:56

标签: c# lucene fuzzy solr-boost

我试图在文档字段上设置提升功能,以使搜索结果更准确,但我认为它不起作用

然而 这是我的代码

  

索引:

  private static void _addToLuceneIndex(Datafile Datafile, IndexWriter writer)
    {
        // remove older index entry
        var searchQuery = new TermQuery(new Term("Id", Datafile.article.Id.ToString()));
        writer.DeleteDocuments(searchQuery);

        // add new index entry
        var doc = new Document();
        var id = new Field("Id", Datafile.article.Id.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED);
        var content = new Field("Content", Datafile.article.Content, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS);
        content.Boost = 4;
        var title = new Field("Title", Datafile.article.Title, Field.Store.YES, Field.Index.ANALYZED);
        title.Boost = 6;
        doc.Add(id);
        doc.Add(content);
        doc.Add(title);
        foreach (var item in Datafile.article.Article_Tag)
        {
            var tmpta = new Field("Atid", item.Id.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED);
            var tagname = new Field("Tagname", item.Tag.name, Field.Store.YES, Field.Index.ANALYZED);
            tagname.Boost = 8;
            doc.Add(tmpta);
            doc.Add(tagname);

        }
        // add lucene fields mapped to db fields

        // add entry to index
        writer.AddDocument(doc);
    }

我已经使用Lukenet来查看字段是否有所增加但是它没有增强并且增强仍然等于 1.0

所以我试着运行并测试它,但结果令我失望

这是我的搜索代码:

  

搜索:

 private static IEnumerable<Datafile> _search(string searchQuery, string searchField = "")
    {
        // validation
        if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", "")))
            return new List<Datafile>();
        var indexReader = IndexReader.Open(Directory, false);
        // set up lucene searcher
        using (var searcher = new IndexSearcher(indexReader))
        {
            var hits_limit = 1000;
            // search by single field
            var enanalyzer = new SnowballAnalyzer(Version.LUCENE_30, "English");
            var aranalyzer = new SnowballAnalyzer(Version.LUCENE_30, "Arabic");
            string[] fields = new string[] { "Title", "Content", "Tagname" };
            // Dictionary<string, float> boosts = new Dictionary<string, float>();
            // boosts.Add("Title", 5);
            // boosts.Add("Content", 3);
            // boosts.Add("Tagname", 7);
            var enparser = new MultiFieldQueryParser(Version.LUCENE_30, fields, enanalyzer);
            var arparser = new MultiFieldQueryParser(Version.LUCENE_30, fields, aranalyzer);
            var query = QueryModel(searchQuery, new QueryParser[] { enparser, arparser });
            searcher.SetDefaultFieldSortScoring(true, false);
            TopFieldCollector collector = TopFieldCollector.Create(new Sort(new SortField(null, SortField.SCORE, false), new SortField("Title", SortField.STRING, true), new SortField("Tagname", SortField.STRING, true), new SortField("Content", SortField.STRING, true)),
            hits_limit,
            false,         // fillFields - not needed, we want score and doc only
            true,          // trackDocScores - need doc and score fields
            true,          // trackMaxScore - related to trackDocScores
            false); // should docs be in docId order?
            searcher.Search(query, collector);
            var hits = collector.TopDocs().ScoreDocs;
            var results = new List<Datafile>();
            foreach (var hit in hits)
            {
                var doc = searcher.Doc(hit.Doc);
                var df = _mapLuceneDocumentToData(doc);
                df.score = hit.Score;
                results.Add(df);
            }
            searcher.Dispose();
            return results;
            // search by multiple fields (ordered by RELEVANCE)

        }
    }
  

QueryModel方法:

private static Query QueryModel(string searchQuery, QueryParser[] parsers)
    {

        BooleanQuery query = new BooleanQuery();
        searchQuery = "*" + searchQuery + "*";

        foreach (var parser in parsers)
        {
            parser.AllowLeadingWildcard = true;

            var thequery = parser.Parse(searchQuery);

            query.Add(new BooleanClause(thequery, Occur.SHOULD));
        }
        return query;
    }

我是lucene.net的新手,我喜欢它,但我无法理解这个问题

  

PS:

我也希望得到一个模糊查询,就像用户输入:

一样

russua的城市获得一个结果,好像他进入了:俄罗斯的城市 我尝试了FuzzyQuery课程但是它无论如何都不起作用,是否有必要使用FuzzyQuery Class来获得该结果

1 个答案:

答案 0 :(得分:0)

因此,由于没有人回答我的问题,并且我找到了解决此问题的方法,我使用了搜索时间查询提升,这是我的代码:

var QParser = new QueryParser(Version.LUCENE_30, "Content", analyzer);
QParser.AllowLeadingWildcard = true;
var Query = new QParser.Parse(searchQuery);
Query.Boost = 7.0f;
return Query;

如果您想进行BooleanQueryOr搜索

,可以使用And