Search code examples
c#asp.net.net-corelucenelucene.net

Lucene .NET Search returns no Results


I've been trying to get Lucene .NET to work in my API, but it always returns 0 Results. Everthing I write here is encapsulated in a Singleton Service, which my API controller uses.

How I create the index:

public async Task<bool> CreateSearchArtefacts()
{
    var analyzer = new StandardAnalyzer(AppLuceneVersion);
    var indexConfig = new IndexWriterConfig(AppLuceneVersion, analyzer);
    using (var dir = FSDirectory.Open(IndexPath))
    {
        using (IndexWriter writer = new IndexWriter(dir, indexConfig))
        {
            foreach (var element in this.data)
            {
                Document doc = new Document
                {
                    new TextField("Title", element.Title, Field.Store.YES),
                    new StringField("Author", element.Author, Field.Store.YES),
                    new TextField("Description", element.Description, Field.Store.NO)
                };

                writer.AddDocument(doc);
                this.logger.LogInformation(element.Title + " added.");
            }

            this.logger.LogInformation("All Books added.");
            writer.Commit();
        };
    };

    return true;
}

And thats how I search for it:

public async Task<SearchResultsCollection> SearchSingleTerms(string term, string search, int count)
{
    this.logger.LogInformation("Searching Term "+ term + " for " + search);
    var phrase = new TermQuery(new Term(term, search));

    var analyzer = new StandardAnalyzer(AppLuceneVersion);
    var indexConfig = new IndexWriterConfig(AppLuceneVersion, analyzer);
    var sendList = new List<SearchResult>();
    using (var dir = FSDirectory.Open(IndexPath))
    {
        using (var writer = new IndexWriter(dir, indexConfig))
        {
            var reader = writer.GetReader(true);
            var searcher = new IndexSearcher(reader);
            var hits = searcher.Search(phrase, count  /* top 20 */).ScoreDocs;

            this.logger.LogInformation("Results found: " + hits.Length);
            foreach (var item in hits)
            {
                var foundDoc = searcher.Doc(item.Doc);
                sendList.Add(new SearchResult()
                {
                    Author = foundDoc.Get("Author"),
                    Title = foundDoc.Get("Title"),
                    Description = foundDoc.Get("Description")
                });
            }

            writer.Flush(triggerMerge: false, applyAllDeletes: false);
        };
    };

    return new SearchResultsCollection() { Count = count, Results = sendList.ToArray() };
}

Im using Lucene.Net 4.8.0-beta00014 with .NET Core 3.1

Any Help is appreciated!


Solution

  • Found it. I had to convert the string parameter for the phrase to a string value.

    public async Task<SearchResultsCollection> SearchSingleTerms(string term, string search, int count)
    {
        this.logger.LogInformation("Searching Term "+ term + " for " + search);
        var phrase = new TermQuery(new Term(term.ToString(), search.ToString()));
    
        var analyzer = new StandardAnalyzer(AppLuceneVersion);
        var indexConfig = new IndexWriterConfig(AppLuceneVersion, analyzer);
        var sendList = new List<SearchResult>();
        using (var dir = FSDirectory.Open(IndexPath))
        {
            using (var writer = new IndexWriter(dir, indexConfig))
            {
                var reader = writer.GetReader(true);
                var searcher = new IndexSearcher(reader);
                var hits = searcher.Search(phrase, count  /* top 20 */).ScoreDocs;
    
                this.logger.LogInformation("Results found: " + hits.Length);
                foreach (var item in hits)
                {
                    var foundDoc = searcher.Doc(item.Doc);
                    sendList.Add(new SearchResult()
                    {
                        Author = foundDoc.Get("Author"),
                        Title = foundDoc.Get("Title"),
                        Description = foundDoc.Get("Description")
                    });
                }
    
                writer.Flush(triggerMerge: false, applyAllDeletes: false);
            };
        };
    
        return new SearchResultsCollection() { Count = count, Results = sendList.ToArray() };
    }