A new feature of MarkLogic 7’s search API is range index scoring – affecting relevancy based on a value within a document. Here I detail a couple of use cases
Range index scoring allows you to determine relevancy by values in a document, rather than matching values against a term exactly.
A good use case of this is for ratings. A higher rating should show nearer the top of search results.
A second use case of that of distance from the centre point of a geospatial query. Just like you get on hotel search websites.
We can now do these directly in MarkLogic without any special voodoo from a developer. Just set up the search options and perform a query. Easy!
Show me!
Below is the feature in action:-
This uses MLJS for rendering results, but the functionality is in core MarkLogic, not MLJS. MarkLogic also calculates a heatmap on the fly. This calculated data is passed to heatmap-openlayers.js. Much more efficient than just sending lots of data to heatmap.js, especially for thousands of visible points.
Note that the MLJS widgets interact with each other – hovering over a marker on the map highlights it in the search results list with a different background colour.
Isn’t this like sorting?
In a word, no.
Sorting is based purely on a value in a document. By changing relevancy scores you can combine different search terms. For example, you could have rating and distance and a word query all contributing to the relevancy score. A result which is a little further but a much higher rating may trump one that’s dead centre on the map, but with a low rating.
How does it work?
Under the hood you provide a set of options and a query. I’ve documented the REST search options I’m using, and the search query I’m sending, and the results I’m getting back raw within a Gist. Go have a read, it’s pretty straight forward. (I tend to go overkill in setting search options though!)
In Summary
Ever wanted to tweak relevancy by values in a document? Now you can! Go have a read of this new V7 feature, download MarkLogic today too, and have a play!