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