Skip to content

Commit

Permalink
Updating Lucene search
Browse files Browse the repository at this point in the history
  • Loading branch information
pranavkm committed Feb 28, 2012
1 parent fad5a05 commit 0064ddb
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 18 deletions.
8 changes: 1 addition & 7 deletions Website/Infrastructure/Lucene/LuceneIndexingService.cs
Expand Up @@ -107,8 +107,7 @@ private static void AddPackages(IndexWriter indexWriter, List<PackageIndexEntity
document.Add(new Field("Tags", package.Tags, Field.Store.NO, Field.Index.ANALYZED));
}
document.Add(new Field("Author", package.Authors, Field.Store.NO, Field.Index.ANALYZED));

document.SetBoost(GetNormalizedBoostValue(package.DownloadCount));
document.Add(new Field("DownloadCount", package.DownloadCount.ToString(CultureInfo.InvariantCulture), Field.Store.YES, Field.Index.NO));

indexWriter.AddDocument(document);
}
Expand Down Expand Up @@ -202,10 +201,5 @@ private static IEnumerable<string> CamelCaseTokenize(string term)
}
yield return term.Substring(tokenStart);
}

private static float GetNormalizedBoostValue(int downloadCount)
{
return (float)(0.5 + Math.Log(downloadCount, 1000));
}
}
}
39 changes: 28 additions & 11 deletions Website/Infrastructure/Lucene/LuceneSearchService.cs
Expand Up @@ -6,6 +6,7 @@
using Lucene.Net.Analysis.Standard;
using Lucene.Net.QueryParsers;
using Lucene.Net.Search;
using Lucene.Net.Index;

namespace NuGetGallery
{
Expand Down Expand Up @@ -74,29 +75,45 @@ private static IEnumerable<int> SearchCore(string searchTerm)
using (var directory = new LuceneFileSystem(LuceneCommon.IndexDirectory))
{
var searcher = new IndexSearcher(directory, readOnly: true);
var query = TryParseQuery(searchTerm);
var results = searcher.Search(query, filter: null, n: 1000, sort: Sort.RELEVANCE);
var query = ParseQuery(searchTerm);
var results = searcher.Search(query, filter: null, n: 1000, sort: new Sort(new[] { SortField.FIELD_SCORE, new SortField("DownloadCount", SortField.INT, reverse: true) }));
var keys = results.scoreDocs.Select(c => Int32.Parse(searcher.Doc(c.doc).Get("Key"), CultureInfo.InvariantCulture))
.ToList();
searcher.Close();
return keys;
}
}

private static Query TryParseQuery(string searchTerm)
private static Query ParseQuery(string searchTerm)
{
var boosts = new Dictionary<string, float> { { "Id-Exact", 2.0f }, { "Id", 1.2f }, { "Description", 0.6f } };
var fields = new Dictionary<string, float> { { "Id", 1.2f }, { "Title", 1.0f }, { "Tags", 1.0f}, { "Description", 0.8f }, { "Author", 0.6f } };
var analyzer = new StandardAnalyzer(LuceneCommon.LuceneVersion);
var queryParser = new MultiFieldQueryParser(LuceneCommon.LuceneVersion, new[] { "Id-Exact", "Id", "Title", "Author", "Description", "Tags" }, analyzer, boosts);
searchTerm = QueryParser.Escape(searchTerm).ToLowerInvariant();

try
{
return queryParser.Parse(searchTerm);
}
catch (ParseException)
var queryParser = new MultiFieldQueryParser(LuceneCommon.LuceneVersion, fields.Keys.ToArray(), analyzer, fields);

var conjuctionQuery = new BooleanQuery();
conjuctionQuery.SetBoost(1.5f);
var disjunctionQuery = new BooleanQuery();
var wildCardQuery = new BooleanQuery();
wildCardQuery.SetBoost(0.7f);
var exactIdQuery = new TermQuery(new Term("Id-Exact", searchTerm));
exactIdQuery.SetBoost(2.5f);

foreach(var term in searchTerm.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries))
{
return queryParser.Parse(QueryParser.Escape(searchTerm));
conjuctionQuery.Add(queryParser.Parse(term), BooleanClause.Occur.MUST);
disjunctionQuery.Add(queryParser.Parse(term), BooleanClause.Occur.SHOULD);

foreach (var field in fields)
{
var wildCardTermQuery = new WildcardQuery(new Term(field.Key, term + "*"));
wildCardTermQuery.SetBoost(0.7f * field.Value);
wildCardQuery.Add(wildCardTermQuery, BooleanClause.Occur.SHOULD);
}
}

return conjuctionQuery.Combine(new Query[] { exactIdQuery, conjuctionQuery, disjunctionQuery, wildCardQuery });
}
}
}

0 comments on commit 0064ddb

Please sign in to comment.