gpt4 book ai didi

elasticsearch - 如何在NEST中使用多个索引分析器?

转载 作者:行者123 更新时间:2023-12-04 05:40:57 25 4
gpt4 key购买 nike

我创建了一个公司类型。在该公司类型内部,我有一个名为“摘要”的字段。如何向该字段添加多个索引分析器?

我简要研究过使用 Yakaz 插件,但似乎我无法将其与 NEST 一起使用。

其背后的原因是,有时用户会在查询中搜索带有句点的公司名称,有时他们不会包含句点。我想使用 ngrams 对带标点符号和不带标点符号的公司名称进行部分匹配。我目前正在使用停用词过滤器来删除标点符号。

摘要字段的属性(有多个索引分析器会引发错误):

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

最佳答案

首先,回答您的问题,您不能将多个分析器添加到单个字段。但是,您可以使用 multi field type 来映射同一字段的多个版本,并对每个版本应用不同的分析器。看看这个answer了解如何使用 NEST 实现此目的。

关于带标点符号和不带标点符号的搜索,如果您使用与索引和搜索分析器相同的分析器,那么这并不重要,因为在索引期间应用于字段的相同分析也将应用于用户查询。

示例:

Foo.Bar 将被索引为 foobar

如果用户搜索 Foo.BarFooBar,搜索分析器会将其转换为 foobar,并且会找到匹配项因为该字段也被索引为 foobar

我认为您的部分问题是您尝试使用 full_match 作为搜索分析器,并使用 partial_match_no_punctuationpartial_match 作为索引分析仪。尝试将它们整合为一个(删除标点符号、ngram),并将其用于您的搜索和索引分析器。如果您发现仍然需要多个分析器,请查看我上面提到的多字段类型。

希望有帮助。

编辑:根据您的更新,多字段映射的问题是您尝试为两个字段分配相同的名称。此外,您将字段命名为“project”,这是您的类型的名称,您可能想将其命名为“summary”。此外,您不希望将 Id 字段包含在摘要多重字段中。试试这个:

.AddMapping<ElasticSearchProject>(m => m
.MapFromAttributes()
.Properties(project => project
.MultiField(mf => mf
.Name(o => o.Summary)
.Fields(f => f
.String(s => s.Name(o => o.Summary).Analyzer("partial_match"))
.String(s => s.Name(o => o.Summary.Suffix("no_punctuation")).Analyzer("partial_match_no_punctuation"))
)))));

这将在您的映射中创建两个字段:

使用 partial_match 分析器进行

summary

summary.no_puncuationpartial_match_no_punctuation 分析器。

关于elasticsearch - 如何在NEST中使用多个索引分析器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24120960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com