--- title: Search taxonomy: category: docs process: twig: true never_cache_twig: true --- The appearance and behavior of the search control can be easily customized with Select2. ## Customizing how results are matched When users filter down the results by entering search terms into the search box, Select2 uses an internal "matcher" to match search terms to results. You may customize the way that Select2 matches search terms by specifying a callback for the `matcher` configuration option. Select2 will pass each option as represented by its [internal representation](/options) into this callback to determine if it should be displayed: ``` function matchCustom(params, data) { // If there are no search terms, return all of the data if ($.trim(params.term) === '') { return data; } // `params.term` should be the term that is used for searching // `data.text` is the text that is displayed for the data object if (data.text.indexOf(params.term) > -1) { var modifiedData = $.extend({}, data, true); modifiedData.text += ' (matched)'; // You can return modified objects from here // This includes matching the `children` how you want in nested data sets return modifiedData; } // Return `null` if the term should not be displayed return null; } $(".js-example-matcher").select2({ matcher: matchCustom }); ``` >>>> When a remote data set is used, Select2 expects that the returned results have already been filtered. ### Matching grouped options Only first-level objects will be passed in to the `matcher` callback. If you are working with nested data, you must iterate through the `children` array and match them individually. This allows for more advanced matching when working with nested objects, allowing you to handle them however you want. This example matches results only if the term appears in the beginning of the string: