【问题标题】:How to use multiple index analyzers in NEST?如何在 NEST 中使用多个索引分析器?
【发布时间】: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


    【解决方案1】:

    首先,要回答您的问题,您不能将多个分析器添加到单个字段。但是,您可以使用multi field 类型来映射同一字段的多个版本,并对每个版本应用不同的分析器。查看此answer,了解如何使用 NEST 完成此操作。

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

    例子:

    Foo.Bar 将被索引为foobar

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

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

    希望对您有所帮助。

    编辑:根据您的更新,多字段映射的问题是您试图为两个字段分配相同的名称。此外,您将字段命名为“项目”,这是您的类型的名称,可能您想将其命名为“摘要”。此外,您不希望将您的 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"))
            )))));
    

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

    summarypartial_match 分析器。

    summary.no_puncuationpartial_match_no_punctuation 分析器。

    【讨论】:

    • 我必须使用不同的分析器进行搜索和索引,因为我将同时查询多种类型。包括时期将有助于其他领域的相关性。至于多字段映射,我现在正在更新我的帖子。我正在关注您链接的帖子,但我的仍然只能识别一个分析器。
    • 一件事可能会解决这个问题,您使用了“后缀:原始”。这就是帮助 ElasticSearch 知道它是同一个字段但名称不同的原因吗?
    • 是的,您正在尝试将相同的名称应用于两个字段。请参阅我关于您的映射的更新答案。 Suffix 方法只是将您传递给它的任何文本附加到字段的末尾。
    猜你喜欢
    • 2018-05-29
    • 2018-11-05
    • 2018-01-12
    • 2021-05-18
    • 1970-01-01
    • 2021-08-12
    • 2021-12-05
    • 1970-01-01
    • 2017-06-27
    相关资源
    最近更新 更多