Copied to clipboard

Flag this post as spam?

This post will be reported to the moderators as potential spam to be looked at


  • Enrico 47 posts 252 karma points
    Dec 18, 2015 @ 16:26
    Enrico
    0

    Umbraco Web Api with Examine Lucene question

    Hello everyone, I am a newbie with Examine and Lucene. I wanted to use them to query the cache instead of hitting the database. It works! The search are performing well and quickly. The only problem that I have is to build queries.

    I want to focus my search on a specific 'nodeTypealias' and get all the 'nodeNames' connected. That was not particularly difficult. The problem started when I wanted to apply another filter to this selection and get only 'nodeName' starting with letter 'a' or 'b'.

    This is my Web APi code:

    public class PeopleApiController : UmbracoApiController
        {
    
    
    
            public IEnumerable<SearchResult> GetPeople(string letter = "") {
    
    
    
                var Searcher = ExamineManager.Instance.SearchProviderCollection["ExternalSearcher"];
                var searchCriteria = Searcher.CreateSearchCriteria(BooleanOperation.Or);
                var q = "nodeTypeAlias:PeopleDetails";
                var query = searchCriteria.RawQuery(q);
    
    
                IEnumerable<SearchResult> results = Searcher.Search(query);
    
                return results;
            }
    
        }
    

    How could I combine the part with wildcards like :

    "nodeName:" + letter + "?";

    I tried also to do something like:

    public IEnumerable<SearchResult> GetPeople(string letter = "") {
    
                var Searcher = ExamineManager.Instance.SearchProviderCollection["ExternalSearcher"];
                var searchCriteria = Searcher.CreateSearchCriteria("content");
                var query = searchCriteria.NodeTypeAlias("PeopleDetails").And().NodeName(letter + "?").Compile();
    
                IEnumerable<SearchResult> results = Searcher.Search(query);
    
                return results;
            }
    
  • Marc Goodson 2157 posts 14435 karma points MVP 9x c-trib
    Dec 18, 2015 @ 19:52
    Marc Goodson
    100

    Hi Enrico

    I think you are looking for the

    MultipleCharacterWildcard()

    extension method

    in

    using Examine.LuceneEngine.SearchCriteria; (add this as a using statement to get access to the extension method)

    eg

        var criteria = searcher.CreateSearchCriteria();
    var query = searchCriteria.NodeTypeAlias("PeopleDetails").And().NodeName(letter.MultipleCharacterWildcard()).Compile();         
    

    More documentation here on the Fluent Search API here

    https://github.com/Shazwazza/Examine/wiki/FluentSearchApi

  • Enrico 47 posts 252 karma points
    Dec 19, 2015 @ 11:14
    Enrico
    0

    Great Mark

    it worked like a charm

    Thanks again

  • Enrico 47 posts 252 karma points
    Jan 04, 2016 @ 11:08
    Enrico
    0

    Hi Mark,

    thanks to your help I built a function that works great with letters.

    This is the code, I hope it could be helpful to anyone that is dealing with the same feature

    HTML CODE :

    <div id="letter-container">
                <div>&nbsp;</div>
                <div><a href="#" >ALL</a></div>
                <div><a href="#a" >A</a></div>
                <div><a href="#b">B</a></div>
                <div><a href="#c">C</a></div>
                <div><a href="#d">D</a></div>
                <div><a href="#e">E</a></div>
                <div><a href="#f">F</a></div>
                <div><a href="#g">G</a></div>
                <div><a href="#h">H</a></div>
                <div><a href="#i">I</a></div>
                <div><a href="#h">J</a></div>
                <div><a href="#k">K</a></div>
                <div><a href="#l">L</a></div>
                <div><a href="#m">M</a></div>
                <div><a href="#n">N</a></div>
                <div><a href="#o">O</a></div>
                <div><a href="#p">P</a></div>
                <div><a href="#q">Q</a></div>
                <div><a href="#r">R</a></div>
                <div><a href="#s">S</a></div>
                <div><a href="#t">T</a></div>
                <div><a href="#u">U</a></div>
                <div><a href="#w">W</a></div>
                <div><a href="#x">X</a></div>
                <div><a href="#y">Y</a></div>
                <div><a href="#z">Z</a></div>
                <div></div>
       </div>
    

    JQuery code :

      $(function () {
    
            $("#letter-container a").on('click', function (e) {
                    e.stopImmediatePropagation();
                    e.preventDefault();
                    var element = $(this);
                    var letter = element.attr('href').replace('#','');
                    // console.log(letter);
    
    
                    $.ajax({
                        url: '/umbraco/api/peopleapi/GetPeople',
                        data:{letter : letter},
                        dataType:'json',
                        success: displayExamineResult,
                        error: displayError
    
                    });
                });
    
    
    
            var displayExamineResult = function (response) {
                    if (typeof response != 'undefined') {
                        if (response != null) {
                            $.each(response, function (index, value) {
    
                                // console.log(index + " " + value);
                                if (value.Fields != null) {
                                    $.each(value.Fields, function (i, v) {
                                       // your code to display results
                                        console.log( i + " : " + v);
                                    });
                                }
    
                            });
    
                        }
                        else {
                            console.log("No result found for the specified search criteria .");
                        }
    
                    }
                };
    
                var displayError = function (jqXHR, textStatus, errorThrown) {
                    console.log(errorThrown);
                };
    
    
     });
    

    The Api Controller Code :

    [HttpGet]
        public IEnumerable<SearchResult> GetPeople(string letter = "") {
            IEnumerable<SearchResult> results;
    
            var Searcher = ExamineManager.Instance.SearchProviderCollection["ExternalSearcher"];
    
            if (string.IsNullOrEmpty(letter))
            {
                var criteria = Searcher.CreateSearchCriteria();
                var query = criteria.NodeTypeAlias("PeopleDetails").Compile();
                results = Searcher.Search(query);
                return results;
            }
            else {
                var criteria = Searcher.CreateSearchCriteria();
                var query = criteria.NodeTypeAlias("PeopleDetails").And().NodeName(letter.MultipleCharacterWildcard()).Compile();
                results = Searcher.Search(query);
                return results;
            }
    
    
        }
    
  • This forum is in read-only mode while we transition to the new forum.

    You can continue this topic on the new forum by tapping the "Continue discussion" link below.

Please Sign in or register to post replies