【问题标题】:Elasticsearch - Order search results ASCElasticsearch - 订单搜索结果 ASC
【发布时间】:2015-06-18 19:37:56
【问题描述】:

我的弹性搜索有问题。

设置:拥有带有数据字段“companyName”的 Company-Class。 我的搜索将搜索并回复所有带有搜索词的公司。

如果我尝试通过排序

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

数据未正确排序 - 参考 stackOverflow

我尝试了给定的解决方案,但如果我将 companyName 设置为“not_analyzed”,我什至无法再搜索公司名称或像开头的“goo”(谷歌) 所以我尝试设置一个多字段映射,带有一个不分析的后缀和一个已分析的后缀。

我的索引设置如下:

  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))))
        )

        )
    )
); 

我的搜索结果如下:

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)

);

但这仍然行不通。 有什么想法吗?

提前致谢。

更新 1:

对于不区分大小写的排序,我添加了一个自定义分析器:

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"))))
                 )

          )
 );

【问题讨论】:

    标签: c# sorting elasticsearch nest


    【解决方案1】:

    这个例子是有效的,也许它会对你的问题有所启发。

    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())
        );
    

    查询结果:

    {
       "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"
                ]
             }
          ]
       }
    }
    

    索引映射:

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

    希望对你有帮助。

    【讨论】:

    • 你好罗!感谢您的帮助,似乎“client.Refresh()”是缺少的组件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2016-06-13
    • 1970-01-01
    相关资源
    最近更新 更多