【发布时间】:2014-07-30 00:48:24
【问题描述】:
我创建了一个公司类型。在该公司类型中,我有一个名为“摘要”的字段。如何向该字段添加多个索引分析器?
我曾短暂研究过使用 Yakaz 插件,但似乎无法将它与 NEST 一起使用。
这背后的原因是,有时用户会在查询中搜索带有句点的公司名称,而有时他们不会包含句点。我想在有和没有标点符号的公司名称上使用 ngram 进行部分匹配。我目前正在使用停用词过滤器来删除标点符号。
摘要字段的属性(拥有多个索引分析器会引发错误):
[ElasticProperty(IndexAnalyzer = "partial_match", IndexAnalyzer = "partial_match_no_punctuation", SearchAnalyzer = "full_match")]
public string Summary { get; set; }
映射:
private static void CreateMapping(ElasticClient client)
{
var partialMatchNoPunctuation = new CustomAnalyzer
{
Filter = new List<string> { "standard", "lowercase", "asciifolding", "punctuation_filter", "name_ngrams" }, //Apply all filters before ngram
Tokenizer = "standard"
};
var partialMatch = new CustomAnalyzer
{
Filter = new List<string> { "standard", "lowercase", "asciifolding", "name_ngrams" }, //Apply all filters before ngram
Tokenizer = "standard"
};
var fullMatch = new CustomAnalyzer
{
Filter = new List<string> { "standard", "lowercase", "asciifolding" },
Tokenizer = "standard"
};
client.CreateIndex(Settings.Default.IndexName, c => c
.Analysis(descriptor => descriptor
.TokenFilters(bases => bases
.Add("name_ngrams", new NgramTokenFilter
{
MaxGram = 11,
MinGram = 3
})
.Add("punctuation_filter", new StopTokenFilter
{
Stopwords = new List<string> {"."}
})
)
.Analyzers(bases => bases
.Add("partial_match", partialMatch)
.Add("partial_match_no_punctuation", partialMatchNoPunctuation)
.Add("full_match", fullMatch))
)
);
}
或者,如果有办法在单个分析器中执行此操作,我愿意接受建议。
编辑:
我的班级名称是“ElasticSearchProject”。我希望将其存储为一种名为“Project”的类型。我相信我的尝试是导致错误的原因。当我得到 Project 类型的映射时,它只应用了部分匹配分析器。
这是唯一仍然适用于我的班级的 ES 属性:
[ElasticType(Name = "Project")]
多字段映射:
.AddMapping<ElasticSearchProject>(m => m
.MapFromAttributes()
.Properties(project=>project
.MultiField(mf=>mf
.Name("Project")
.Fields(f=>f
.Number(s=>s.Name(o=>o.Id).Index(NonStringIndexOption.no))
.String(s => s.Name(o => o.Summary).IndexAnalyzer("partial_match"))
.String(s => s.Name(o => o.Summary).IndexAnalyzer("partial_match_no_punctuation"))
))))
【问题讨论】:
标签: elasticsearch nest