如何使用多个指标分析在NEST?(How to use multiple index analyze

2019-10-20 06:44发布

我有我创建了一个公司类型。 内部的公司类型的我有一个名为“摘要”字段。 我怎样才能多指数分析仪添加到这个领域?

我简要地看着使用Yakaz插件,但它不会出现,我可以使用与窝。

这背后的原因是,有时用户会为公司名称搜索,在他们的查询,其他时间他们将不包括周期的周期。 我想这样做使用的n-gram双方的公司名称有和没有标点符号部分匹配。 我目前使用禁用词过滤器除去标点符号。

摘要字段的属性(拥有多个指标分析仪抛出一个错误):

[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”。 我想它被存储为一个名为“工程”的类型。 我相信我在这个尝试是什么原因造成的错误。 当我得到的映射类型的项目,它不仅具有适用于它的部分匹配分析。

这是唯一的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"))
            ))))

Answer 1:

首先,要回答你的问题,你不能多分析仪增加一个字段。 但是,您可以使用多场类型映射同一领域的多个版本,并适用不同的分析他们每个人。 结帐这个答案对于如何与NEST做到这一点。

在关于使用和不使用标点符号搜索,如果你使用相同的分析仪为您的索引和搜索仪,那么就此事那倒因为被索引过程中施加于该领域的同样的分析也将被应用到用户查询。

例:

Foo.Bar将被索引为foobar

如果用户搜索或者Foo.BarFooBar ,搜索分析仪将它转换为foobar ,并匹配会被发现,因为该领域也被收录为foobar

我觉得你的问题的一部分是,你要使用full_match作为搜索分析器和partial_match_no_punctuationpartial_match为您指数分析。 尝试并把它们调和成一个(除去标点符号,的n-gram),并用它为您的搜索和索引分析仪。 如果你发现你仍然需要多个分析仪,再看看我上面提到的多字段类型。

希望帮助。

编辑:根据您的更新,与多字段映射的问题是,你正在试图同一个名称分配给这两个领域。 此外,你命名域“项目”,这是你的类型的名称,也许你想命名为“摘要”来代替。 此外,您不希望包括您的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分析器。



文章来源: How to use multiple index analyzers in NEST?