Calling all developers! We invite you to provide your input on Feature Experimentation by completing this brief survey.
Calling all developers! We invite you to provide your input on Feature Experimentation by completing this brief survey.
Try changing
.BoostMatching(p => p.MatchTypeHierarchy(typeof(PdfFile)) & ((PdfFile)p).Name.Contains(searchString), 4)
to this
.BoostMatching(p => p.MatchTypeHierarchy(typeof(PdfFile)) & ((PdfFile)p).Name.Match(searchString), 4)
But that would only match PDF files where property Name matches the search query exactly, right? At least that was how I was taught Match works. I want to have PDF files where Name fully or partly contains the search query so if the query is "brev" then I want to boost PDF files with name "Skicka brev" etc.
Ah, you are right. Then I guess you have to add some kind of wildcard search extention.
Something similar to the FuzzyFilter method specified here:
https://world.episerver.com/forum/developer-forum/-Episerver-75-CMS/Thread-Container/2016/12/episerver-find---how-to-do-fuzzy-search/
I did a quick test: Document with Name "Sending letters" got match when using FuzzyFilter with "letters".
Hmm, do you mind showing how you use that filter? I saw that post but didn´t really think it would work together with the boosting, since it's not only that I want to use a fuzzy search in general, but actually boost those items.
I just did a quick test to verify that filter actually would match. I altered the extension to this:
public static ITypeSearch<T> FuzzyFilter<T>( this ITypeSearch<T> search, Expression<Func<T, string>> fieldSelector, string almost, double? minSimilarity = null) { var fieldName = search.Client.Conventions .FieldNameConvention .GetFieldNameForAnalyzed(fieldSelector); var wildcardQuery = new FuzzyQuery(fieldName, almost.ToLowerInvariant()) { MinSimilarity = minSimilarity }; //Add it to the search request body return new Search<T, WildcardQuery>(search, context => { if (context.RequestBody.Query != null) { var boolQuery = new BoolQuery(); boolQuery.Should.Add(context.RequestBody.Query); boolQuery.Should.Add(wildcardQuery); boolQuery.MinimumNumberShouldMatch = 1; context.RequestBody.Query = boolQuery; } else { context.RequestBody.Query = wildcardQuery; } }); }
And then used it like this:
_client.Search<Document>() .FuzzyFilter(d => d.Name, query, 1) .GetResult();
That works alright, by itself as a separate filter to match the Name property against the query (which of course could be useful), but it´s not really working with boosting the way I want with PDF files specifically. However, I´m not sure as to where the requirement came from and the background so I´m going to dig a bit deeper into that to see if this could be a solution.
Thanks a bunch for this!
Hi!
I have a request from a client asking to boost PDF files if the name of the PDF contains the query, but I haven´t found a good way to accomplish that.
Basically what I want to do is this:
Of course .BoostMatching(p => p.MatchTypeHierarchy(typeof(PdfFile)) & ((PdfFile)p).Name.Contains(searchString), 4) doesn´t work because that won´t be compiled to a filter, but it´s the essence of what I want. I can´t use AnyWordBeginsWith() since the requirement isn´t that the word in the name should start with the query. The MatchFuzzy() won´t work either because as I understand it, it will match on like similiar words which isn´t the requirement either.
Have I missed something or is this just not possible? Seems quite simple so I thought that would be possible. Hopefully I´ve just missed something :)
Best,
Petra