elasticsearch 弹性搜索嵌套未正确匹配,elasticsearch,nest,elasticsearch,Nest" /> elasticsearch 弹性搜索嵌套未正确匹配,elasticsearch,nest,elasticsearch,Nest" />

elasticsearch 弹性搜索嵌套未正确匹配

elasticsearch 弹性搜索嵌套未正确匹配,elasticsearch,nest,elasticsearch,Nest,使用Elasticsearch和Nest 2.x 基于一些(疯狂的)用户需求,我需要将所有可搜索字段复制到单个字段,并将其小写,忽略空格。当用户键入要搜索的内容时,我将其小写,并删除用作搜索字符串的空格 例如: “敏捷的棕色狐狸”。。。在弹性搜索中,为了便于搜索,我希望这是“快速浏览信息” 以下搜索应与上述文档匹配: 提克里克 t 罗恩 核因子 以下是我构建索引的方式: var customerSearchIdxDesc = new CreateIndexDescriptor(Consta

使用Elasticsearch和Nest 2.x

基于一些(疯狂的)用户需求,我需要将所有可搜索字段复制到单个字段,并将其小写,忽略空格。当用户键入要搜索的内容时,我将其小写,并删除用作搜索字符串的空格

例如: “敏捷的棕色狐狸”。。。在弹性搜索中,为了便于搜索,我希望这是“快速浏览信息”

以下搜索应与上述文档匹配:

  • 提克里克
  • t
  • 罗恩
  • 核因子
以下是我构建索引的方式:

var customerSearchIdxDesc = new CreateIndexDescriptor(Constants.ElasticSearch.CustomerSearchIndexName)
    .Settings(f =>
        f.Analysis(analysis => analysis
                .Analyzers(analyzers => analyzers
                    .Custom(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram, a => a
                        .Filters("lowercase")
                        .Tokenizer(Constants.ElasticSearch.TokenizerNames.NoWhitespaceNGram)))
                .Tokenizers(tokenizers => tokenizers
                        .NGram(Constants.ElasticSearch.TokenizerNames.NoWhitespaceNGram, t => t
                            .MinGram(1)
                            .MaxGram(500)
                            .TokenChars(TokenChar.Digit, TokenChar.Letter, TokenChar.Punctuation, TokenChar.Symbol)
                        )
                )
        )
    )
    .Mappings(ms => ms.Map<ServiceModel.DtoTypes.Customer.SearchResult>(m => m
        .AutoMap()
        .Properties(p => p
            .String(n => n.Name(c => c.CustomerName).CopyTo(f =>
            {
                return new FieldsDescriptor<string>().Field("search");
            }).Index(FieldIndexOption.Analyzed).Analyzer(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram))
            .String(n => n.Name(c => c.ContactName)
                        .CopyTo(fs => fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
                        .Index(FieldIndexOption.Analyzed)
                        .Analyzer(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram))
            .String(n => n.Name(c => c.CustomerName)
                        .CopyTo(fs => fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
                        .Index(FieldIndexOption.Analyzed)
                        .Analyzer(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram))
            .String(n => n.Name(c => c.City)
                        .CopyTo(fs => fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
                        .Index(FieldIndexOption.Analyzed)
                        .Analyzer(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram))
            .String(n => n.Name(c => c.StateAbbreviation)
                        .CopyTo(fs => fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
                        .Index(FieldIndexOption.Analyzed)
                        .Analyzer(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram))
            .String(n => n.Name(c => c.Country)
                        .CopyTo(fs => fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
                        .Index(FieldIndexOption.Analyzed)
                        .Analyzer(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram))
            .String(n => n.Name(c => c.PostalCode)
                        .CopyTo(fs => fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
                        .Index(FieldIndexOption.Analyzed)
                        .Analyzer(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram))
            .String(n => n.Name(Constants.ElasticSearch.CombinedSearchFieldName)
                        .Index(FieldIndexOption.Analyzed)
                        .Analyzer(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram))
            )
        )
    );
var customerSearchIdxDesc=new CreateIndexDescriptor(Constants.ElasticSearch.CustomerSearchIndexName)
.设置(f=>
f、 分析(分析=>分析
.分析仪(分析仪=>分析仪
.Custom(Constants.ElasticSearch.AnalyzerNames.LowercaseNGram,a=>a
.Filters(“小写”)
.Tokenizer(常数.ElasticSearch.TokenizerNames.NoWhitespaceNGram)))
.Tokenizers(Tokenizers=>Tokenizers
.NGram(Constants.ElasticSearch.TokenizerNames.NoWhitespaceNGram,t=>t
明格拉姆先生(1)
.MaxGram(500)
.TokenChars(TokenChar.Digit、TokenChar.Letter、TokenChar.标点符号、TokenChar.Symbol)
)
)
)
)
.Mappings(ms=>ms.Map(m=>m
.AutoMap()
.Properties(p=>p
.String(n=>n.Name(c=>c.CustomerName).CopyTo(f=>
{
返回新字段descriptor().Field(“搜索”);
}).Index(FieldIndexOption.analysis).Analyzer(常量.ElasticSearch.AnalyzerNames.lowerscengram))
.String(n=>n.Name(c=>c.ContactName)
.CopyTo(fs=>fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
.Index(FieldIndexOption.analysis)
.Analyzer(常量.ElasticSearch.AnalyzerNames.小写)
.String(n=>n.Name(c=>c.CustomerName)
.CopyTo(fs=>fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
.Index(FieldIndexOption.analysis)
.Analyzer(常量.ElasticSearch.AnalyzerNames.小写)
.String(n=>n.Name(c=>c.City)
.CopyTo(fs=>fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
.Index(FieldIndexOption.analysis)
.Analyzer(常量.ElasticSearch.AnalyzerNames.小写)
.String(n=>n.Name(c=>c.state缩写)
.CopyTo(fs=>fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
.Index(FieldIndexOption.analysis)
.Analyzer(常量.ElasticSearch.AnalyzerNames.小写)
.String(n=>n.Name(c=>c.Country)
.CopyTo(fs=>fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
.Index(FieldIndexOption.analysis)
.Analyzer(常量.ElasticSearch.AnalyzerNames.小写)
.String(n=>n.Name(c=>c.PostalCode)
.CopyTo(fs=>fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
.Index(FieldIndexOption.analysis)
.Analyzer(常量.ElasticSearch.AnalyzerNames.小写)
.String(n=>n.Name(Constants.ElasticSearch.CombinedSearchFieldName)
.Index(FieldIndexOption.analysis)
.Analyzer(常量.ElasticSearch.AnalyzerNames.小写)
)
)
);
正如您所看到的,我在分析器上使用小写过滤器,并使用tokenchar,这样就可以省略空格(好吧,这就是想法,它不起作用)

以下是我用来搜索的内容:

var response = client.Search<DtoTypes.Customer.SearchResult>(s =>
    s.From(0)
    .Take(Constants.ElasticSearch.MaxResults)
    .Query(q => q
        .MatchPhrase(mp => mp
            .Field(Constants.ElasticSearch.CombinedSearchFieldName)
            .Query(query))));
var-response=client.Search(s=>
s、 从(0)
.Take(常量.ElasticSearch.MaxResults)
.Query(q=>q
.MatchPhrase(mp=>mp
.Field(Constants.ElasticSearch.CombinedSearchFieldName)
。查询(查询));
以下是问题:

  • 空白似乎没有被省略(它看起来像是单词上唯一的匹配项)
  • 部分匹配似乎仅适用于后缀。例如,搜索“aby”不会匹配“深渊”,但“yss”会匹配
  • 跨词搜索“快速”不起作用。。。搜索“theq”不匹配任何内容

    • 我相信这解决了我的问题。。。通过添加字符过滤器,将其添加到分析器,然后使用EdgeNgram标记器。。。不知道这是否是最佳设置,但它似乎可以工作

      var customerSearchIdxDesc = new CreateIndexDescriptor(Constants.ElasticSearch.CustomerSearchIndexName)
          .Settings(f =>
              f.Analysis(analysis => analysis
                      .CharFilters(cf => cf
                          .PatternReplace(Constants.ElasticSearch.FilterNames.RemoveWhitespace, pr => pr
                              .Pattern(" ")
                              .Replacement(string.Empty)
                          )
                      )
                      .Analyzers(analyzers => analyzers
                          .Custom(Constants.ElasticSearch.AnalyzerNames.DefaultAnalyzer, a => a
                              .Filters("lowercase")
                              .CharFilters(Constants.ElasticSearch.FilterNames.RemoveWhitespace)
                              .Tokenizer(Constants.ElasticSearch.TokenizerNames.DefaultTokenizer)
                          )
                      )
                      .Tokenizers(tokenizers => tokenizers
                              .EdgeNGram(Constants.ElasticSearch.TokenizerNames.DefaultTokenizer, t => t
                                  .MinGram(1)
                                  .MaxGram(500)
                              )
                      )
              )
          )
          .Mappings(ms => ms.Map<ServiceModel.DtoTypes.Customer.SearchResult>(m => m
              .AutoMap()
              .Properties(p => p
                  .String(n => n.Name(c => c.CustomerName).CopyTo(f =>
                  {
                      return new FieldsDescriptor<string>().Field("search");
                  }).Index(FieldIndexOption.Analyzed).Analyzer(Constants.ElasticSearch.AnalyzerNames.DefaultAnalyzer))
                  .String(n => n.Name(c => c.ContactName)
                              .CopyTo(fs => fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
                              .Index(FieldIndexOption.Analyzed)
                              .Analyzer(Constants.ElasticSearch.AnalyzerNames.DefaultAnalyzer))
                  .String(n => n.Name(c => c.CustomerName)
                              .CopyTo(fs => fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
                              .Index(FieldIndexOption.Analyzed)
                              .Analyzer(Constants.ElasticSearch.AnalyzerNames.DefaultAnalyzer))
                  .String(n => n.Name(c => c.City)
                              .CopyTo(fs => fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
                              .Index(FieldIndexOption.Analyzed)
                              .Analyzer(Constants.ElasticSearch.AnalyzerNames.DefaultAnalyzer))
                  .String(n => n.Name(c => c.StateAbbreviation)
                              .CopyTo(fs => fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
                              .Index(FieldIndexOption.Analyzed)
                              .Analyzer(Constants.ElasticSearch.AnalyzerNames.DefaultAnalyzer))
                  .String(n => n.Name(c => c.Country)
                              .CopyTo(fs => fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
                              .Index(FieldIndexOption.Analyzed)
                              .Analyzer(Constants.ElasticSearch.AnalyzerNames.DefaultAnalyzer))
                  .String(n => n.Name(c => c.PostalCode)
                              .CopyTo(fs => fs.Field(Constants.ElasticSearch.CombinedSearchFieldName))
                              .Index(FieldIndexOption.Analyzed)
                              .Analyzer(Constants.ElasticSearch.AnalyzerNames.DefaultAnalyzer))
                  .String(n => n.Name(Constants.ElasticSearch.CombinedSearchFieldName)
                              .Index(FieldIndexOption.Analyzed)
                              .Analyzer(Constants.ElasticSearch.AnalyzerNames.DefaultAnalyzer))
                  )
              )
          );
      
      var customerSearchIdxDesc=new CreateIndexDescriptor(Constants.ElasticSearch.CustomerSearchIndexName)
      .设置(f=>
      f、 分析(分析=>分析
      .CharFilters(cf=>cf
      .PatternReplace(Constants.ElasticSearch.FilterNames.RemoveWhitespace,pr=>pr
      .图案(“”)
      .Replacement(string.Empty)
      )
      )
      .分析仪(分析仪=>分析仪
      .Custom(Constants.ElasticSearch.AnalyzerNames.DefaultAnalyzer,a=>a
      .Filters(“小写”)
      .CharFilters(常数.ElasticSearch.FilterNames.RemoveWhitespace)
      .Tokenizer(常量.ElasticSearch.TokenizerNames.DefaultTokenizer)
      )
      )
      .Tokenizers(Tokenizers=>Tokenizers
      .EdgeNGram(Constants.ElasticSearch.TokenizerNames.DefaultTokenizer,t=>t
      明格拉姆先生(1)
      .MaxGram(500)
      )
      )
      )
      )