Case In-Senstive Sort


(Ahmad Bukhari) #1

I've been using elastic searh 5.5.0. And I've noticed that my sorting is not working properly. The results i get from search were not sorted as expected, they were being sorted on the basis of ascii value's.
Example:
Actual Output

Book
Chair
Table
board
cat

Expected Output

Book
board
Chair
cat
Table

I used analyzers with filter "lowercase" and "asciifolding" But failed to get the desired result.


(David Pilato) #2

Could you provide a full recreation script as described in

It will help to better understand what you are doing.
Please, try to keep the example as simple as possible.


(Ahmad Bukhari) #3

I'm using NEST to implement this and here is the complete Method Implementation:
public static CreateIndexRequest GetIndexMapping(string index)
{
var newIndex = new CreateIndexRequest(index);
newIndex.Settings = new IndexSettings();
newIndex.Mappings = new Mappings();
newIndex.Settings.Analysis = new Analysis();
newIndex.Settings.Analysis.Analyzers = new Analyzers();
newIndex.Settings.Analysis.Normalizers = new Normalizers();
newIndex.Settings.Analysis.Analyzers.Add(Constant.ANALYZER, new CustomAnalyzer() { Tokenizer = "keyword", Filter = new List { "lowercase", "asciifolding" } });
newIndex.Settings.Analysis.Normalizers.Add("KeywordNormalizer", new CustomNormalizer() {Filter = new List { "lowercase", "asciifolding" } });
var indexTypes = new string[] { Constant.USER_TYPE, Constant.GROUP_TYPE, Constant.CONTACT_TYPE, Constant.COMPUTER_TYPE, Constant.OU_TYPE, Constant.HISTORY_TYPE };
foreach (var item in indexTypes)
{
var typeMapping = new TypeMapping();
typeMapping.DynamicTemplates = new DynamicTemplateContainer();
// text template
var stringTemplate = new DynamicTemplate();
stringTemplate.MatchMappingType = "string";
stringTemplate.Match = "*";
var property = new TextProperty() { Type = "text", Analyzer = Constant.ANALYZER, SearchAnalyzer = Constant.ANALYZER };
property.Fields = new Properties();
property.Fields.Add("keyword", new KeywordProperty() { Type = "keyword", IgnoreAbove = 1000});

                stringTemplate.Mapping = property;
                // long template
                var longTemplate = new DynamicTemplate();
                longTemplate.MatchMappingType = "long";
                longTemplate.Match = "*";
                var longProperty = new NumberProperty() { Type = "long" };
                longProperty.Fields = new Properties();
                longProperty.Fields.Add("keyword", new KeywordProperty() { Type = "keyword", IgnoreAbove = 1000});
                longTemplate.Mapping = longProperty;
                // bool template
                var boolTemplate = new DynamicTemplate();
                boolTemplate.MatchMappingType = "boolean";
                boolTemplate.Match = "*";
                var boolProperty = new BooleanProperty() { Type = "boolean" };
                boolProperty.Fields = new Properties();
                boolProperty.Fields.Add("keyword", new KeywordProperty() { Type = "keyword", IgnoreAbove = 1000});
                boolTemplate.Mapping = boolProperty;
                // binary template

                typeMapping.DynamicTemplates.Add("ImanamiThumbnailTemplate", GetBinaryTemplate("*thumbnail*"));
                typeMapping.DynamicTemplates.Add("ImanamiPhotoTemplate", GetBinaryTemplate("*photo*"));
                typeMapping.DynamicTemplates.Add("ImanamiPictureTemplate", GetBinaryTemplate("*picture*"));
                typeMapping.DynamicTemplates.Add("ImanamiStringTemplate", stringTemplate);
                typeMapping.DynamicTemplates.Add("ImanamiLongTemplate", longTemplate);
                typeMapping.DynamicTemplates.Add("ImanamiBoolTemplate", boolTemplate);
                newIndex.Mappings.Add(item, typeMapping);
            }
            return newIndex;
        }

(system) #4

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.