Elasticsearch - Order ASC Search Results

has a problem with my search for elastics.

Setting: presence of company class with data field "companyName". My search should search and respond to all companies with a specified deadline.

If I try to sort through

.Sort(x=> x.OnField(x => x.CompanyName).Descending())

Data is not sorted correctly - link to stackoverflow

I tried the given solution, but if I set my company name to "not_analyzed" I can't even search for the comnpany name or as the beginning of "goo" (google) anymore. So I tried to set up multilevel matching with a suffix that is not parsed and parsed.

My index is configured like this:

  client.CreateIndex(IndexName, c => c       
    .AddMapping<Exhibitor>(m =>m
        .MapFromAttributes()                        
        .Properties(o => o
        .MultiField(mf=>mf
            .Name(x=>x.CompanyName)             
            .Fields(fs => fs
                    .String(s=>s.Name(t=>t.CompanyName).Index(FieldIndexOption.Analyzed).Analyzer("standard"))
            .String(s=>s.Name(t=>t.CompanyName.Suffix("raw")).Index(FieldIndexOption.NotAnalyzed))))
        )

        )
    )
); 

      

My search looks like this:

string SearchTerm ="my search term"
results = GetClient().Search<Company>(s => s 
    .Query(qa => qa 
       .MatchPhrasePrefix(m => m
       .OnField(f=>f.CompanyName)
      .Query(SearchTerm)
    ))

   .Sort(x => x.OnField(x => x.CompanyName.Suffix("raw")).Descending())

  .Size(maxResults).Skip(page * pageSize).Take(pageSize)

);

      

But it still doesn't work. Any ideas?

Thanks in advance.

Update 1:

For case insensitive sort, I added a custom parser:

var companyAnalyzer = new CustomAnalyzer
{
     Filter = new List<string> { "standard", "lowercase" },
      Tokenizer = "keyword"
};
client.CreateIndex(IndexName, c => c
       .Analysis(analysis => analysis
            .Analyzers(a => a
               .Add("companyanalyzer", companyAnalyzer)
             )
        )
         .AddMapping<Exhibitor>(m => m
              .MapFromAttributes()
              .Properties(o => o
                  .MultiField(mf => mf
                     .Name(x => x.CompanyName)
                         .Fields(fs => fs
                               .String(s => s.Name(t => t.CompanyName).Index(FieldIndexOption.Analyzed).Analyzer("standard"))
                               .String(s => s.Name(t => t.CompanyName.Suffix("raw")).Index(FieldIndexOption.Analyzed).Analyzer("companyanalyzer"))))
                 )

          )
 );

      

+3


source to share


1 answer


This example works, maybe it will refresh your problem a little.

var indicesResponse = client.DeleteIndex(descriptor => descriptor.Index(indexName));

client.CreateIndex(indexName, c => c
    .AddMapping<Exhibitor>(m => m
        .MapFromAttributes()
        .Properties(o => o
            .MultiField(mf => mf
                .Name(x => x.CompanyName)
                .Fields(fs => fs
                    .String(s => s.Name(t => t.CompanyName).Index(FieldIndexOption.Analyzed).Analyzer("standard"))
                    .String(s => s.Name(t => t.CompanyName.Suffix("raw")).Index(FieldIndexOption.NotAnalyzed))))
        )));


client.Index(new Exhibitor { Id = 1, CompanyName = "a test" });
client.Index(new Exhibitor { Id = 2, CompanyName = "b test" });
client.Index(new Exhibitor { Id = 3, CompanyName = "c test" }); 

client.Refresh();

string SearchTerm = "test";
var results = client.Search<Exhibitor>(s => s
    .Query(qa => qa
        .MatchPhrasePrefix(m => m
            .OnField(f => f.CompanyName)
            .Query(SearchTerm)
        ))
    .Sort(x => x.OnField(f => f.CompanyName.Suffix("raw")).Descending())
    );

      

The result of this query:

{
   "took": 2,
   "timed_out": false,
   "_shards": {..}
   "hits": {
      "total": 3,
      "max_score": null,
      "hits": [
         {
            "_index": "my_index",
            "_type": "exhibitor",
            "_id": "3",
            "_score": null,
            "_source": {
               "id": 3,
               "companyName": "c test"
            },
            "sort": [
               "c test"
            ]
         },
         {
            "_index": "my_index",
            "_type": "exhibitor",
            "_id": "2",
            "_score": null,
            "_source": {
               "id": 2,
               "companyName": "b test"
            },
            "sort": [
               "b test"
            ]
         },
         {
            "_index": "my_index",
            "_type": "exhibitor",
            "_id": "1",
            "_score": null,
            "_source": {
               "id": 1,
               "companyName": "a test"
            },
            "sort": [
               "a test"
            ]
         }
      ]
   }
}

      



Index display:

{
    "my_index" : {
        "mappings" : {
            "exhibitor" : {
                "properties" : {
                    "companyName" : {
                        "type" : "string",
                        "analyzer" : "standard",
                        "fields" : {
                            "raw" : {
                                "type" : "string",
                                "index" : "not_analyzed"
                            }
                        }
                    },
                    "id" : {
                        "type" : "integer"
                    }
                }
            }
        }
    }
}

      

Hope it helps.

+1


source







All Articles