Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Phrase matching with Sitecore ContentSearch API

I am using Sitecore 7.2 with a custom Lucene index and Linq. I need to give additional (maximum) weight to exact matches.

Example: A user searches for "somewhere over the rainbow"

Results should include items which contain the word "rainbow", but items containing the exact and entire term "somewhere over the rainbow" should be given maximum weight. They will displayed to users as the top results. i.e. An item containing the entire phrase should weigh more heavily than an item which contains the word "rainbow" 100 times.

I may need to handle ranking logic outside of the ContentSearch API by collecting "phrase matches" separately from "wildcard matches", and that's fine.

Here's my existing code, truncated for brevity. The code works, but exact phrase matches are not treated as I described.

using (var context = ContentSearchManager.GetIndex("sitesearch-index").CreateSearchContext())
{
    var pred = PredicateBuilder.False<SearchResultItem>();
    pred = pred
        .Or(i => i.Name.Contains(term)).Boost(1)
        .Or(i => i["Field 1"].Contains(term)).Boost(3)
        .Or(i => i["Field 2"].Contains(term)).Boost(1);

    IQueryable<SearchResultItem> query = context.GetQueryable<SearchResultItem>().Where(pred);
    var hits = query.GetResults().Hits;
    ...
}

How can I perform exact phrase matching and is it possible with the Sitecore.ContentSearch.Linq API?

like image 944
betitall Avatar asked Jun 14 '16 18:06

betitall


1 Answers

Answering my own question. The problem was with the parenthesis syntax. It should be

.Or(i => i.Name.Contains(term).Boost(1))

rather than

.Or(i => i.Name.Contains(term)).Boost(1)

The boosts were not being observed.

like image 156
betitall Avatar answered Dec 05 '22 00:12

betitall